C#enum – 为什么*隐式*从0开始工作?

拿这段代码:

enum En { val1, val2, } void Main() { En plop = 1; //error: Cannot implicitly convert type 'int' to 'En' En woop = 0; //no error } 

当然,在为enum类型变量赋值1时会失败。 (打一个明确的演员,它会起作用。)

我的问题是:为什么分配0时不会失败?

就是这样,因为这就是规范所说的……

这是另一个原因,为什么总是一个好主意,给你的所有枚举一个值为0的项目,’因为你有时可能会得到它们的价值。


C#语言规范6.1.3中的相应部分:

6.1.3隐式枚举转换

隐式枚举转换允许将decimal-integer-literal 0转换为任何枚举类型和任何可以为其类型为枚举类型的可空类型。 在后一种情况下,通过转换为基础枚举类型并包装结果来评估转换(第4.1.10节)。

至于为什么会这样 – 嗯,我想只有语言委员会中有人会决定这些事情才会知道。

事实上,如果你看一下Rawling对原始问题的评论,我们确实有类似的东西。

您只能隐式使用0的原因是因为0将始终是有效的enum类型,其中1,2,3或任何其他数字可能不一定是有效类型。 例如试试这个

 enum En { val1=1, val2=2, } 

0仍然是有效的enum类型,因为无论你做什么,0都是默认值。 这意味着如果你不让一个值等于0,它将为你生成一个0 enum类型。