一尘不染

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

c#

有一个:

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


阅读 296

收藏
2020-05-19

共1个答案

一尘不染

ECMA-334(C#语言规范)开始

13.1.3隐式枚举转换

隐式枚举转换允许将十进制整数0转换为任何枚举类型。

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

枚举(C#参考)

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

2020-05-19