2012-02-16 15 views
10

例コード:線Cで列挙0値矛盾

public enum Foods 
    { 
     Burger, 
     Pizza, 
     Cake 
    } 

    private void button1_Click(object sender, EventArgs e) 
    { 
     Eat(0); // A 
     Eat((Foods)0); // B 
     //Eat(1); // C : won't compile : cannot convert from 'int' to 'Foods' 
     Eat((Foods)1); // D  
    } 

    private void Eat(Foods food) 
    { 
     MessageBox.Show("eating : " + food); 
    } 

コードはコンパイルされませんが、ラインAは正常にコンパイル。 このような場合に特別な扱いを受ける0の値を持つ列挙型の特別なものはありますか?

答えて

14

はい、リテラル0は任意の列挙型に暗黙的に変換可能であり、その型の既定値を表します。 C#言語仕様、特にenumのセクション1.10に従う:

任意の列挙型の既定値は、列挙型に変換された整数値ゼロです。変数が自動的にデフォルト値に初期化される場合、これは列挙型の変数に与えられた値です。列挙型のデフォルト値を簡単に利用できるようにするために、リテラル0は暗黙的に任意の列挙型に変換されます。 enum型のデフォルト値を簡単に利用できるようにするには、リテラル0を暗黙的に任意のenum型に変換します。

+0

はい。ここで、「0」はデフォルトを意味します。 「1」とはどういう意味ですか? –

+0

@David:何もありません。 'Foods food = 1;'はコンパイルされません。しかし、任意のリテラルを列挙型にキャストすることができるので、 'Foods food =(Foods)1;'はうまくいきます。 –

+0

アンソニーが正しいです。リテラルゼロを任意の列挙型に暗黙的に変換できる理由は、言語設計者が有用な機能であると判断し、仕様に記述したためです。 – phoog