24

有一个:

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

4

2 回答 2

17

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

13.1.3 隐式枚举转换

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

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

枚举(C# 参考)

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

于 2013-02-19T05:56:51.570 回答
2

我还要补充一点,语句中的语法 with而0不是 exact可能容易出错。考虑以下代码:enumswitch

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尽管在大多数情况下is的默认值0,因此可能会出现这种语法,但我会使用确切的enum.

于 2013-02-19T06:09:04.307 回答