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

Rys*_*gan 23 .net c# enums switch-statement

有一个:

enum SomeEnum
{
    A = 0,
    B = 1,
    C = 2
}
Run Code Online (Sandbox Code Playgroud)

现在编译器允许我写:

SomeEnum x = SomeEnum.A;
switch(x)
{
    case 0: // <--- Considered SomeEnum.A
        break;
    case SomeEnum.B:
        break;
    case SomeEnum.C:
        break;
    default:
        break;
}
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

为什么只存在隐式转换0

Hab*_*bib 16

来自ECMA-334(C#语言规范)

13.1.3隐式枚举转换

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

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

枚举(C#参考)

为新版本的枚举分配其他值或更改枚举成员的值可能会导致依赖源代码出现问题.通常情况是在switch语句中使用枚举值,并且如果已将其他元素添加到枚举类型,则默认值的测试可能会意外地返回true.