枚举类型中的0值不一致性

10

示例代码:

    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个回答

14

是的,字面值为0的枚举类型可以隐式转换为任何枚举类型,并表示该类型的默认值。根据C#语言规范,特别是关于枚举类型的第1.10节:

任何枚举类型的默认值是将整数值零转换为枚举类型得到的。在变量自动初始化为默认值的情况下,这是赋给枚举类型变量的值。为了使枚举类型的默认值容易获得,字面值为0会隐式转换为任何枚举类型。

为了使枚举类型的默认值容易获得,字面值为0会隐式转换为任何枚举类型。


是的。这里的“0”表示默认值。那么“1”代表什么? - David Schwartz
@David:什么都没有。 Foods food = 1; 无法编译。不过,你可以将任何字面量强制转换为枚举,所以 Foods food = (Foods)1; 就没问题了。 - Cody Gray
安东尼是正确的。你可以将字面值零隐式转换为任何枚举类型的原因是语言设计者确定它是一个有用的功能,并将其写入规范中。 - phoog

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接