Oggi mi sono imbattuto in una possibile anomalia delle enumerazioni. Consideriamo una enum dichiarata così:
public enum MyEnum {
Val0 = 0,
Val10 = 10,
Val2,
Val3 = 7,
Val11 = 11
}
Un possible frammento di codice che usa l'enum può essere il seguente:
.....
MyEnum p = MyEnum .Val11;
int i = (int) p;
Console.WriteLine("MyEnum : {0}, i: {1}", p, i);
p = MyEnum .Val2;
i = (int)p;
Console.WriteLine("MyEnum : {0}, i: {1}", p, i);
Cosa viene visualizzato a video? E' naturale aspettarsi di trovare le seguenti righe:
"MyEnum : Val11, i: 11"
"MyEnum : Val2, i: 2"
Invece inaspettatamente a video sarà stampato:
"MyEnum : Val11, i: 11"
"MyEnum : Val11, i: 11"
Dopo una discussione con i sempre attenti Adrian e Lawrence la risposta è stata data direttamente dalle specifiche di C#. I punti chiave si trovano nel paragrafo 1.10 e nel paragrafo 14.3.
1.10: "When an enum member declaration does not explicitly specify a value, the member is given the value zero (if it is the first member in the enum type) or the value of the textually preceding enum member plus one."
Questo elemento della specifica spiega perchè a Val2 viene associato il valore 11. Ma che senso ha? Più avanti nelle specifiche sono fornite ulterori spiegazioni:
14.3: "Multiple enum members may share the same associated value".
Quindi ricapitolando le enumerazioni possono avere membri con valori equivalenti ma non possono esserci due membri con lo stesso nome (esattamente come le define in c/c++). In definitiva il membro Val2 è solo un alias del membro Val10. Ora quadra tutto, ma rimane ancora una cosa in sospeso....
Enumeration bug?
NO!