有一个:
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。但我不能写:
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?
从ECMA-334(C#语言规范)开始
13.1.3隐式枚举转换 隐式枚举转换允许将十进制整数0转换为任何枚举类型。
13.1.3隐式枚举转换
隐式枚举转换允许将十进制整数0转换为任何枚举类型。
枚举的默认值是0,在编译时,这就是为什么在switch语句中允许它的原因。对于以外的值0,无法在编译时确定此值是否存在于枚举中。
枚举(C#参考)
为新版本的枚举分配其他值,或在新版本中更改枚举成员的值,可能会导致相关源代码出现问题。通常 在switch语句中使用枚举值,并且如果在枚举类型中添加了其他元素,则默认值的测试可能会意外返回true。