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 暗黙の列挙変換

暗黙の列挙型変換により、10 進整数リテラル 0 を任意の列挙型に変換できます。

enum のデフォルト値は0であり、コンパイル時にそれがわかっているため、switch ステートメントで許可されます。以外の値の場合0、この値が列挙型に存在するかどうかをコンパイル時に判断することはできません。

列挙型 (C# リファレンス)

列挙型の新しいバージョンに追加の値を割り当てたり、新しいバージョンで列挙型メンバーの値を変更したりすると、依存するソース コードで問題が発生する可能性があります。多くの場合、switch ステートメントで列挙値が使用され、追加の要素が列挙型に追加されている場合、既定値のテストで予期せず true が返されることがあります。

于 2013-02-19T05:56:51.570 に答える
2

I would also add, that the syntax with 0 instead of the exact enum in the switch statement may become error prone. Consider the following code:

enum TestEnum
{
    NA = 0,
    A
}

and then

var e = TestEnum.NA;
switch(e)
{
    case 0:
        {
            break;
        }
    case TestEnum.A:
        {
            break;
        }
}

This compiles and works well. However if for some reason, enum declaration changes to

enum TestEnum
{
    NA = 1,
    A
}

everything will get broken.

Though in the majority of situations the default value for enum is 0 and for that reason this syntax may take place, I would use the exact enum.

于 2013-02-19T06:09:04.307 に答える