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时不会失败?
这样做是因为规范是这么说的…
这也是为什么给所有的枚举赋值为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
类型