2013-06-06 20 views
8

は、このコードのビットを取る:もちろんC#enum - 0からの*暗黙的なキャストはなぜ機能しますか?

enum En { 
    val1, 
    val2, 
} 

void Main() 
{ 
    En plop = 1; //error: Cannot implicitly convert type 'int' to 'En' 
    En woop = 0; //no error 
} 

enum型変数に1を割り当てるときに、それが失敗しました。 (明示的なキャストを叩くとうまくいく)

私の質問は、なぜ0を割り当てると失敗しないのですか?それはスペックが言うことだからそれはこの方法だ

+1

** [なぜenumのスイッチは0に暗黙の変換を受け入れますが、他の整数は何もしませんか?](http://stackoverflow.com/questions/14950750/why-switch-for-enum-accepts-暗黙的な変換から0以外の他の形式への変換)**および** [コンパイラの値の型の解決とハードコードされた "0"の整数値](http://stackoverflow.com/questions/14224465) /コンパイラ値タイプの解像度およびハードコードされた0の整数値)。 –

+0

明確なdupe、短い答えをしています。 – Jodrell

+0

デフォルトでは、最初の列挙メンバーの値が宣言に設定されていない場合、その値はゼロです。 http://msdn.microsoft.com/en-us/library/ms182149(v=vs.100).aspx –

答えて

9

...

あなたがそれらを取得する可能性が高いですcosを。これは、」、それは常に、すべての列挙型に値0を持つアイテムを与えることをお勧めしますもう一つの理由でありますその価値は時々ある。


C#言語仕様6.1.3に適切なセクション:

6.1.3暗黙的な列挙変換を

暗黙列挙変換は、10進整数リテラル0を可能にします任意のenum型およびその基になる型がenum型のnullable型に変換できます。後者の場合、変換は基礎となる列挙型に変換し、結果をラップすることによって評価されます(4.1.10)。 なぜについては

それはその方法です - まあ、私はこれらの事を知っているだろうことを決定言語委員会の唯一の誰かを推測します。

実際には、元の質問に対するrawlingのコメントを見ると、私たちはそういうことをしています。

+2

それを拡張することができますか? –

+1

これはどのように質問に答えますか?デフォルトの初期化は、コンパイラがコード内で 'myEnum = 0'を許可することとは関係ありません。 0'を構造体に渡しますが、それでもデフォルトは初期化されます.boolに '0'を代入することはできませんが、それでもデフォルトは初期化されます。 – Rawling

+1

@Rawling良い点、 –

1

0は暗黙的に0しか使用できない理由は、0が常に有効なenumタイプになり、1,2,3または他の数字が必ずしも有効なタイプではない可能性があるからです。例えば、0は関係なく、あなたは何をすべきか、デフォルトではありませんので、この

enum En { 
val1=1, 
val2=2, 
} 

0がまだ有効enumタイプでみてください。つまり、値の1つを0にしないと、0 enumタイプが生成されます。

関連する問題