Im abscence eines „default“ Mitglied, ich glaube, es um einen Wert haben repräsentiert die wörtliche wertvoll int 0
Egal was passiert, wird eine gegebene Enum mit wörtlichen Wert erstellt werden 0. Die meisten Gerade Fall ist hier als Mitglied einer Struktur. Eine C# -Struktur hat immer einen leeren Standardkonstruktor, der alle Felder auf ihren Standardwert initialisiert. Im Fall einer Enumeration ist das der Literalwert 0. Die Frage ist, wie man damit umgeht.
Für mich ist dies ein Problem des Stils: Wenn die enum nicht explizit auf einen Wert initialisiert wird, sollte es einen beliebigen gültigen Wert oder einen bestimmten Wert geben, der eine fehlende explizite Initialisierung anzeigt?
enum Color { Unknown, Red, Blue }
enum Color2 { Red,Blue }
struct Example<T> {
Color color;
}
static void SomeMethod() {
var v1 = new Example<Color>();
var v2 = new Example<Color2>();
}
Wenn v1 das Farbfeld überprüft wird, wird es explizit als nicht initialisiertes Feld gekennzeichnet. In v2 wird das Feld einfach "Rot" sein. Es gibt keine Möglichkeit für einen Programmierer, zwischen "Explizit gesetzt" auf "Rot" oder einem impliziten Standardwert zu "Rot" zu erkennen.
Ein anderer Fall, in dem dies ein Problem verursacht, ist eine Switch-Anweisung gegen einen Enum-Wert. Lässt leicht die Definition von Color2 ändern.
enum Color2 { Red = 1, Blue = 2 }
static void SomeOtherMethod(p1 as Example<Color2>) {
switch (p1.color) {
case Color.Red: {}
case Color.Blue: {}
default: {throw new Exception("What happened?"); }
}
}
Der Switch verarbeitet jeden expliziten Wert in der Enumeration. Dieser Code wird jedoch für den Standardkonstruktor von Beispiel <Color2> fehlschlagen, und es gibt keine Möglichkeit, diesen Konstruktor zu unterdrücken.
Dies bringt eine slighly wichtige Regel auf: Haben Sie einen expliziten Enum-Wert für den wörtlichen Wert 0
Einverstanden, die sauberste Lösung ist ein Nullable-Typ. Es wird auch gut auf DB-Schemata abgebildet. –
Es ist bedauerlich, dass enums in .NET Sie nicht zwingen, einen gültigen Wert überhaupt zu übergeben. Ich könnte (Farbe) 123123 übergeben, die kompilieren würde und gut funktionieren würde - die Draw-Methode müsste die Validierung durchführen :( –
Wahrscheinlich eine Vererbung von C, wo der Compiler nicht weiß, ob eine Enumeration als eine echte Enumeration verwendet wird Typ oder als eine Reihe von Flags. So wirft es seine Hände in die Luft und ergibt sich. –