2012-02-16 15 views
10

Przykład Kod:Enum wartość 0 niespójność

public enum Foods 
    { 
     Burger, 
     Pizza, 
     Cake 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Eat(0); // A 
     Eat((Foods)0); // B 
     //Eat(1); // C : won't compile : cannot convert from 'int' to 'Foods' 
     Eat((Foods)1); // D  
    } 

    private void Eat(Foods food) 
    { 
     MessageBox.Show("eating : " + food); 
    } 

kod w linii C nie kompilowania, ale linia A kompiluje. Czy jest coś wyjątkowego w enum z wartością 0, która traktuje to jako specjalne traktowanie w takich przypadkach?

Odpowiedz

14

Tak, literał 0 jest niejawnie wymienialny na dowolny typ wyliczeniowy i reprezentuje wartość domyślną dla tego typu. Zgodnie ze specyfikacją języka C#, w szczególności sekcja 1.10 dotycząca wyliczeń:

Domyślną wartością dowolnego typu wyliczeniowego jest całka zerowa przekształcona na typ wyliczeniowy. W przypadkach, gdy zmienne są automatycznie inicjowane do wartości domyślnej, jest to wartość nadana zmiennym typu enum. Aby domyślna wartość typu wyliczeniowego była łatwo dostępna, literał 0 niejawnie konwertuje się na dowolny typ wyliczeniowy. Aby domyślna wartość typu wyliczeniowego była łatwo dostępna, literał 0 niejawnie konwertuje się na dowolny typ wyliczeniowy.

+0

Tak. Tutaj "0" oznacza domyślnie. Co znaczy "1"? –

+0

@ David: Nic. 'Foods food = 1;' nie skompilowałoby się. Można jednak * rzucić * dowolny literał do wyliczenia, więc "Żywność jedzenie = (Żywność) 1;" jest w porządku. –

+0

Anthony ma rację. Powodem, dla którego można niejawnie przekonwertować literalne zero do dowolnego typu wyliczeniowego, jest to, że projektanci języka stwierdzili, że jest to przydatna funkcja i zapisali ją w specyfikacji. – phoog