Dato questo codice:Enum.GetValues (typeof (....)) non restituendo il corretto enum valori
public enum Enum1
{
ONE,
TWO
}
public enum Enum2
{
A,
B
}
Questo codice restituisce ONE, TWO:
foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
Ma questo codice, invece di fallire (perché Enum2 e
viene utilizzato con typeof(Enum1)
), restituisce A, B:
foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
perché?
Ovviamente lo fanno ... Sciocco! Ho dimenticato che le enumerazioni in C# sono in realtà di fantasia.Ero più abituato alle enumerazioni di Java che sono classi a pieno titolo. Triste che il compilatore non lo cattura però ... – JohnDoDo
@JohnDoDo: Il compilatore non lo cattura perché "foreach (Enum2 e ..." esegue una ** conversione ** esplicita - un cast, in modo efficace - da il tipo di raccolta al tipo di variabile loop. È legale per * cast * '(Enum2) enum1', quindi è legale fare implicitamente la stessa cosa con un * foreach *. Ricorda, foreach è stato inventato prima dei generici; aveva una ArrayList di stringhe, dovresti essere in grado di dire 'foreach (stringa s in myArrayList)' e fare automaticamente la conversione esplicita. –