2012-02-16 12 views
10
código

Ejemplo:Enum 0 valor inconsistencia

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); 
    } 

Código en la línea C no se compilará, pero la línea A compila bien. ¿Hay algo especial acerca de una enumeración con valor 0 que le otorgue un trato especial en casos como este?

Respuesta

14

Sí, el literal 0 es implícitamente convertible a cualquier tipo de enumeración y representa el valor predeterminado para ese tipo. Según la especificación del lenguaje C#, en particular la sección 1.10 en enumeraciones:

El valor predeterminado de cualquier tipo de enumeración es el valor integral cero convertido al tipo enum. En los casos en que las variables se inicializan automáticamente a un valor predeterminado, este es el valor dado a las variables de los tipos enum. Para que el valor predeterminado de un tipo de enumeración esté fácilmente disponible, el literal 0 se convierte implícitamente en cualquier tipo de enumeración. Para que el valor predeterminado de un tipo de enumeración sea fácilmente disponible, el literal 0 se convierte implícitamente a cualquier tipo de enumeración.

+0

Sí. Aquí "0" significa predeterminado. ¿Qué significa "1"? –

+0

@David: Nada. 'Foods food = 1;' no compilaría. Sin embargo, puedes * moldear * cualquier literal en una enumeración, por lo tanto, 'Comida alimentos = (Alimentos) 1;' está bien. –

+0

Anthony tiene razón. La razón por la que puede convertir implícitamente el cero literal a cualquier tipo de enumeración es que los diseñadores del lenguaje determinaron que era una característica útil y la escribieron en la especificación. – phoog

Cuestiones relacionadas