Teniendo en cuenta este código:Enum.GetValues (typeof (....)) no devolver la enumeración adecuada valores
public enum Enum1
{
ONE,
TWO
}
public enum Enum2
{
A,
B
}
Este código devuelve UNO, DOS:
foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
Pero este código, en lugar de fallar (debido a que se utiliza con Enum2 e
typeof(Enum1)
), devuelve A, B:
foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
¿Por qué?
Por supuesto que sí ... ¡Qué tonto! Olvidé que en las enumeraciones de C# son realmente fantasiosas.Estaba más acostumbrado a las enumeraciones de Java que son clases completas. Es triste que el compilador no lo capte ... – JohnDoDo
@JohnDoDo: El compilador no lo detecta porque "foreach (Enum2 e ..." hace una conversión ** explícita ** - un molde, efectivamente - de el tipo de colección al tipo de variable de bucle. Es legal * cast * '(Enum2) enum1', por lo que es legal hacer lo mismo implícitamente con * foreach *. Recuerde, foreach fue inventado antes de los genéricos; tenía un ArrayList de cadenas, querría poder decir 'foreach (string s en myArrayList)' y hacer la conversión explícita hecha automáticamente. –