为什么 enum 的开关接受隐式转换为 0,但不接受任何其他整数的隐式转换

本文关键字:转换 不接受 任何 其他 整数 enum 为什么 开关 | 更新日期: 2023-09-27 17:59:56

有一个:

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

为什么 enum 的开关接受隐式转换为 0,但不接受任何其他整数的隐式转换

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

13.1.3 隐式枚举转换

隐式枚举转换允许十进制-整数-文本 0 表示转换为任何枚举类型。

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

枚举(C# 参考(

为其他值分配新版本的枚举,或更改 新版本中枚举成员的值可能会导致以下问题: 从属源代码。通常情况下,枚举值是 在 switch 语句中使用,以及是否添加了其他元素 对于枚举类型,默认值的测试可以返回 true 竟然。

我还要补充一点,0 而不是 switch 语句中的确切enum的语法可能容易出错。请考虑以下代码:

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