2012-02-16 38 views
10

示例代碼:枚舉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); 
    } 

在線C代碼不能編譯,但線A編譯罰款。 有沒有什麼特別的關於一個值爲0的枚舉在這種情況下得到特殊處理?

回答

14

是的,文字0可隱式轉換爲任何枚舉類型並表示該類型的默認值。根據C#語言規範,特別是關於枚舉的第1.10節:

任何枚舉類型的默認值是轉換爲枚舉類型的整數值零。在變量被自動初始化爲默認值的情況下,這是賦予枚舉類型變量的值。爲了使枚舉類型的默認值容易獲得,文字0將隱式轉換爲任何枚舉類型。要使枚舉類型的默認值易於使用,文字0將隱式轉換爲任何枚舉類型。

+0

是的。這裏「0」表示默認值。 「1」是什麼意思? – 2012-02-16 03:16:59

+0

@David:什麼都沒有。 '食物食物= 1;'不會編譯。但是,你可以將任何文字轉換成枚舉,所以'Foods food =(Foods)1;'就好了。 – 2012-02-16 03:18:29

+0

安東尼是對的。您可以將文字零隱式轉換爲任何枚舉類型的原因是語言設計者將其確定爲有用的功能並將其寫入規範中。 – phoog 2012-02-16 04:35:30