为什么switch for enum接受隐式转换为0但没有任何其他整数?

时间:2013-02-19 05:52:00

标签: c# .net enums switch-statement

有一个:

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只存在隐式转换?

2 个答案:

答案 0 :(得分:16)

来自ECMA-334 (C# Language Specification)

  

13.1.3隐式枚举转化

     
    

隐式枚举转换允许decimal-integer-literal     0将转换为任何枚举类型。

  

enum's默认值为0,并且在编译时已知这是为什么在switch语句中允许它的原因。对于0以外的值,在编译时无法确定此值是否存在于枚举中。

enum (C# Reference)

  

为新版本的枚举分配其他值,或更改   新版本中枚举成员的值可能会导致问题   依赖源代码。通常情况是枚举值   用于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}}。