Bei einer Enumeration werden Bezeichnern ganzzahlige Werte zugrunde gelegt. Der Standard-Datentyp für diese Werte ist int, es werden aber auch byte, sbyte, short, ushort, uint, long oder ulong verwendet werden. Erstellen wir eine Klasse mit einer Enumerations-Variablen, so wird dieser ein default-Wert zugewiesen. Dieser default-Wert ergibt sich aus dem default-Wert des zugrundeliegenden Datentyps, und das ist bei den für Enumerationen erlaubten Datentypen immer 0. Der default-Wert einer Enumeration ist somit nicht zwingend immer der erste definierte Wert – und auch nicht immer ein valider Enum-Wert!
Um dies zu verdeutlichen, erstellen wir uns mehrere Enumerationen, bei denen den einzelnen Werten unterschiedliche numerische Werte zugrunde gelegt werden.
1: private enum EnumHello
2: {
3: Hello, // wird mit 0 belegt
4: World // wird mit 1 belegt
5: }
6: private enum EnumWorld
7: {
8: Hello = -1,
9: World // wird mit 0 belegt
10: }
Um die Zuweisung von default-Werte zu prüfen, erzeugen wir uns eine Klasse, die jeweils eine Property dieser Enumerationen hält.
1: private class EnumTester
2: {
3: public EnumHello Hello { get; set; }
4: public EnumWorld World { get; set; }
5: }
Erstellen wir nun eine Instanz dieser Klasse und geben danach direkt die den Properties zugewiesene Werte aus, so sehen wir, dass immer der Wert mit dem zugrundeliegenden Wert 0 gesetzt ist.
1: EnumTester test = new EnumTester();
2:
3: Console.WriteLine(string.Format("default EnumHello: {0} ({1})", test.Hello, Enum.GetName(typeof(EnumHello), test.Hello)));
4: Console.WriteLine(string.Format("default EnumWorld: {0} ({1})", test.World, Enum.GetName(typeof(EnumWorld), test.World)));
Doch was passiert nun, wenn wir keinen Enumerationswert zum Wert 0 haben?
Hierzu erstellen wir eine Enumeration, die bei 1 beginnt.
1: private enum EnumUndefined
2: {
3: Hello = 1,
4: World // wird mit 2 belegt
5: }
Die Ausgabe auf der Konsole zeigt, dass dennoch der Wert 0 gesetzt ist, der ermittelte Name aber NULL ist.
Dies sollte bei der Erstellung von Enumerationen berücksichtigt werden. Es macht auch keinen Unterschied, ob wir eine Enumerations-Variable nicht initialisieren, oder den Wert über default(Enumeration) beziehen. Daher auch die Empfehlung von Microsoft, generell ein default-Element mit dem Wert 0 zu erstellt.