c# enum -为什么从0开始的*隐式*强制转换可以工作

本文关键字:隐式 工作 转换 enum 为什么 开始 | 更新日期: 2023-09-27 18:17:07

取这段代码:

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

当然,当将1赋值给enum类型的变量时,它会失败。(打一个显式类型转换,它就会工作。)

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

c# enum -为什么从0开始的*隐式*强制转换可以工作

这样做是因为规范是这么说的…

这也是为什么给所有的枚举赋值为0的元素总是一个好主意的另一个原因,因为有时你可能会得到值为0的元素。


c#语言规范6.1.3中适当的部分:

6.1.3隐式枚举转换

隐式枚举转换允许将十进制整型字面值0转换为任何枚举类型和其基础类型为枚举类型的任何可空类型。在后一种情况下,通过转换为基础的enum类型并包装结果来计算转换(第4.1.10节)。

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

事实上,如果你看看rawling对最初问题的评论,我们确实有这样的东西

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

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

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