有一个:
enum SomeEnum
{
A = 0,
B = 1,
C = 2
}
现在编译器允许我写:
SomeEnum x = SomeEnum.A;
switch(x)
{
case 0: // <--- Considered SomeEnum.A
break;
case SomeEnum.B:
break;
case SomeEnum.C:
break;
default:
break;
}
0
被视为SomeItems.A
。但我不能写:
SomeEnum x = SomeEnum.A;
switch(x)
{
case 0:
break;
case 1: // <--- Here is a compilation error.
break;
case SomeEnum.C:
break;
default:
break;
}
为什么0
只存在隐式转换?
答案 0 :(得分:16)
来自ECMA-334 (C# Language Specification)
13.1.3隐式枚举转化
隐式枚举转换允许decimal-integer-literal 0将转换为任何枚举类型。
enum's默认值为0
,并且在编译时已知这是为什么在switch语句中允许它的原因。对于0
以外的值,在编译时无法确定此值是否存在于枚举中。
为新版本的枚举分配其他值,或更改 新版本中枚举成员的值可能会导致问题 依赖源代码。通常情况是枚举值 用于switch语句,以及是否添加了其他元素 对于枚举类型,默认值的测试可以返回true 出乎意料。强>
答案 1 :(得分:2)
我还要补充一点,0
语句中使用enum
而不是switch
语句中的确切enum TestEnum
{
NA = 0,
A
}
的语法可能会出错。请考虑以下代码:
var e = TestEnum.NA;
switch(e)
{
case 0:
{
break;
}
case TestEnum.A:
{
break;
}
}
然后
enum
这编译并运行良好。但是,如果由于某种原因,enum TestEnum
{
NA = 1,
A
}
声明更改为
enum
一切都会被打破。
虽然在大多数情况下0
的默认值为enum
,因此可能会出现这种语法,我会使用确切的{{1}}。