Große Aufzählungen im .NET Framework
Neulich wurde ich mit der Definition einer besonders umfangreichen Aufzählung konfrontiert. Da hierfür die magische 32Bit Grenze überschritten wurde, war ich skeptisch. Ein Test ergab, das diese Skepsis in der Tat berechtigt war. Folgende Deklaration:
public enum Big { Small = 1 << 1, Medium = 1 << 8, Large = 1 << 40 } |
erzeugt dann das Problem. Bis hier:
var enumTest = Big.Small; Debug.Assert(enumTest == Big.Small); enumTest = Big.Medium; Debug.Assert(enumTest == Big.Medium); enumTest = Big.Large; Debug.Assert(enumTest == Big.Large); |
erscheint alles in Orndung, ein Ausgabetest:
var enumTest = Big.Small; Console.WriteLine(enumTest); enumTest = Big.Medium; Console.WriteLine(enumTest); enumTest = Big.Large; Console.WriteLine(enumTest); |
zeigt aber dann das Problem. Die Definition Medium und Large sind intern identisch:
Small Medium Medium
Zur Lösung des Problems muss man zwei Änderungen durchführen. Einmal ist der Aufzählungstyp von long abzuleiten und die Basiszahl für die Bitverschiebung muss ebenfalls eine long-Zahl sein:
public enum Big: long { Small = 1L << 1, Medium = 1L << 8, Large = 1L << 40 } |
Das Ergebnis bestätigt die korrekte Ausführung. Bei der Nutzung von 64 Bit ist aber dann vorerst wirklich Schluss!