Недопустимость значения Enum 0

Пример кода:

    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 не будет компилироваться, но строка A компилируется в порядке. Есть ли что-то особенное в перечислении с 0 значением, которое получает специальное лечение в таких случаях?

Ответ 1

Да, буква 0 неявно конвертируется в любой тип перечисления и представляет значение по умолчанию для этого типа. Согласно спецификации языка С#, в частности, раздел 1.10 перечисления:

Значение по умолчанию для любого типа перечисления - это целочисленное значение, преобразованное в тип перечисления. В тех случаях, когда переменные автоматически инициализируются значением по умолчанию, это значение, данное переменным типов перечисления. Для того, чтобы значение типа enum было доступно по умолчанию, литерал 0 неявно преобразуется в любой тип перечисления. Для того чтобы значение по умолчанию для типа перечисления было легко доступно, литерал 0 неявно преобразуется в любой тип перечисления.