2012-02-17 10 views

Odpowiedz

9

Ponieważ pod okładkami Wyrażenia są tylko ints - drugi zwraca wartości Enum1, ale tak naprawdę te wartości to tylko 0 i 1. Po przeniesieniu tych wartości do typu Enum2 są one nadal prawidłowe i odpowiadają wartościom "A" i "B".

+1

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

+6

@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. –

3

Podczas korzystania z Enum.GetValues() zwraca wartości bazowe. Podczas korzystania z foreach(Type...) wykonuje rzutowanie na typ wyliczeniowy. Tak więc, chociaż mogą nie być tym samym Enum, mają te same podstawowe wartości, które nie mają problemu z rzucaniem.

Co dzieje się w przybliżeniu równoważne z niniejszym

int value = Enum.GetValues(typeof(Enum2))[1]; // this isn't valid code, it's more simplified 
Enum1 casted = (Enum1)value; 
8

Ponieważ wartości swoich teksty stałe są niejawnie liczby całkowite:

public enum Enum1 
{ 
    ONE = 0, 
    TWO = 1 
} 

public enum Enum2 
{ 
    A = 0, 
    B = 1 
} 

Wartości Enum1 są niejawnie konwertowane do liczb całkowitych, a następnie do wartości z Enum2. Jeśli nowo Enum1 następująco ...

public enum Enum1 
{ 
    ONE = 0, 
    TWO = 1, 
    THREE = 2, 
} 

... wtedy byłoby nie nie wrócić „A, B”, ponieważ nie ma wartości w Enum2 na wartość całkowitą 2

+1

Wartości wyliczenia zaczynają się od 0, a właściwie to drukuje 'A, B, 2' zamiast niepowodzenia - zobacz [Casting ints to enums in C#] (http://stackoverflow.com/questions/1758321/casting-ints-to-enums-in-c-sharp) – Justin

+0

@Justin naprawiony, dzięki. –

1

Nie jest niejawnym rzutowaniem z Enum1 -> int i int -> Enum2.

0

Powodem tego jest to, że wyliczenia są domyślnie rzutowane na System.Int (zakładając, że są to wartości domyślne, które są domyślnie).

Twoje drugie foreach następnie wyraźnie rzuca wyniki Enum.GetValues(typeof(Enum1)) na Enum2.

2

Enum.GetValues(typeof(Enum1)) powrót {0,1} i foreach będzie wyliczyć w tym zakresie

1

Przypuszczam ktoś taki jak Jon Skeet mógł tu przyjść i całkowicie wyjaśnić, co dzieje się lepiej niż ja, ale ten kod:

foreach (Enum2 e in Enum.GetValues(typeof(Enum1))) 
{ 
    Console.WriteLine(e); 
} 

... wyświetla wszystkie twoje wartości Enum1 jako typy .

Ponieważ typ enum dane jest jak rodzaj int danych, swoje wartości liczbowe od Enum1 są wykorzystywane do indeksu Enum2.

Powiązane problemy