拿这段代码:
enum En {
val1,
val2,
}
void Main()
{
En plop = 1; //error: Cannot implicitly convert type 'int' to 'En'
En woop = 0; //no error
}
当然,分配1
给enum
-type 变量时它会失败。(打一个明确的演员表,它会起作用。)
我的问题是:为什么在分配 0 时它不会失败?
拿这段代码:
enum En {
val1,
val2,
}
void Main()
{
En plop = 1; //error: Cannot implicitly convert type 'int' to 'En'
En woop = 0; //no error
}
当然,分配1
给enum
-type 变量时它会失败。(打一个明确的演员表,它会起作用。)
我的问题是:为什么在分配 0 时它不会失败?
之所以这样,是因为规范是这么说的……
这是另一个原因,为什么给所有枚举一个值为 0 的项目总是一个好主意,因为有时你可能会用这个值来获得它们。
C# 语言规范 6.1.3 中的相应部分:
6.1.3 隐式枚举转换
隐式枚举转换允许将十进制整数文字 0 转换为任何枚举类型和任何其基础类型为枚举类型的可空类型。在后一种情况下,通过转换为基础枚举类型并包装结果来评估转换(第 4.1.10 节)。
至于为什么会这样——好吧,我想只有语言委员会中决定这些事情的人会知道。
事实上,如果您查看 rawling 对原始问题的评论,我们确实有类似的情况。
您只能隐式使用 0 的原因是因为 0 始终是有效enum
类型,而 1、2、3 或任何其他数字可能不一定是有效类型。例如试试这个
enum En {
val1=1,
val2=2,
}
0 仍然是有效enum
类型,因为无论您做什么,0 都是默认值。这意味着如果您不让其中一个值等于 0,它将enum
为您生成 0 类型。