2013-02-19 1 views
21

があります:なぜenumのスイッチは暗黙の変換を0に受け入れますが、他の整数は受け付けません。

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; 
} 

0SomeItems.Aを考えられています。しかし、私は書くことができません:

なぜ0の暗黙の変換が存在するのですか?

+2

同様の質問に対するエリック・リッパートの答えを参照してください。http:// stackoverflow。com/a/14238286/414076 –

答えて

16

ECMA-334 (C# Language Specification)から

13.1.3暗黙列挙変換

暗黙列挙変換は小数点整数リテラル 0は、任意の列挙型に変換することを可能にします。

enum'sデフォルト値は0で、コンパイル時にswitch文で許可されている理由がある知られています。 0以外の値の場合、コンパイル時にこの値が列挙型に存在するかどうかを判断することはできません。追加の値を列挙型の新しいバージョンを割り当て、または新しいバージョンで列挙メンバーの 値を変更

enum (C# Reference)

、 依存ソースコードに問題を引き起こす可能性があります。 switch文でenumの値が であり、追加の要素が列挙型に を追加した場合、既定値のテストではtrueを返す可能性があります。 が予期せず発生します。

+1

これはなぜそうなのですか? –

+0

@yBee、enumのデフォルト値は整数ベースの値型である '0'なのでと思う。 – Habib

+0

今私は、例えば、フィールドが初期化される 'struct'または' class'です。したがって、列挙型のフィールドがある場合、その列挙型にそのような項目がなくてもその値は「0」です。したがって、フィールドは_cunfused_状態ですが、それでも有効です。だから私たちが非常に単純で不変な列挙型を持っていても、スイッチに常に 'default'ラベルを使うべきです。 –

2

私もswitch文の代わりに、正確なenum0と構文はエラーが発生しやすくなる可能性があること、追加します。

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を使用します。

+1

面白いのは、 'SomeEnum'に' 0'がないように 'A'を' 3'に変更しても、 'SomeEnum x = 0'とスイッチの 'case 0:'ラベルをキャッチします。 –

+0

@yBeeもう1つの答えを読むと、enumの値は常に0です。これは言語仕様で定義されているenum型のデフォルト値です。 –

+0

@yBee偉大な通知...私もそれを認識していない。私にとっても、私は 'enums'を使ってそのようなことを避けるでしょう。 – horgh

関連する問題