Biorąc pod uwagę ten kod:Enum.GetValues (typeof (....)) nie powraca prawidłowego wyliczenia wartości
public enum Enum1
{
ONE,
TWO
}
public enum Enum2
{
A,
B
}
Ten kod zwraca jeden, dwa:
foreach (Enum1 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
ale ten kod, zamiast braku (ponieważ Enum2 e
jest używany typeof(Enum1)
), zwraca, B:
foreach (Enum2 e in Enum.GetValues(typeof(Enum1)))
{
Console.WriteLine(e);
}
dlaczego tak jest?
Oczywiście, że tak ... Głupi mnie! Zapomniałem, że w C# enum są rzeczywiście fantazyjne ints.Byłem bardziej przyzwyczajony do wyliczeń Javy, które są pełnoprawnymi klasami. Smutne, że kompilator go nie łapie ... – JohnDoDo
@JohnDoDo: Kompilator go nie łapie, ponieważ "foreach (Enum2 e ..." robi ** wyraźną ** konwersję - odlew, skutecznie - od typ kolekcji dla typu zmiennej pętli. Jest legalne dla * cast * '(Enum2) enum1', więc legalne jest robienie tego samego bezwarunkowo z * foreach *. Pamiętaj, że foreach zostało wymyślone przed generycznymi, jeśli miał ArrayList z łańcuchów, chciałbyś móc powiedzieć 'foreach (string s w myArrayList)' i mieć wyraźną konwersję zrobioną automatycznie. –