2015-11-05 38 views
4

我有一些代碼需要ulong參數,並且通過使用映射字典將ulong映射到enum中的值。然而,枚舉包含對於所有意圖的目的相同的值,所以這些都是以類似的方式在枚舉重新分配後作爲AfricanMango在以下枚舉:打印枚舉值時發生意外輸出

public enum Fruits 
{ 
    Banana = 0, 
    Strawberry, 
    Apple, 
    Peach, 
    Mango, 
    Berry, 

    AfricanMango = Mango, 

    Cranberry 
} 

應該告訴編譯器對AfricanMangoMango使用相同的值,從設計的角度來看,這種實現是否真的有意義。

我的代碼正在將輸入轉換爲枚舉值,並且在評估函數的結果時返回了Fruits.Cranberry。這是我期待的價值。

然而,當隨後使用該函數的結果(這在調試器權利Fruits.Cranberry),結果突然偏移到Fruits.Berry,如可以通過運行下面的代碼來證明:

var fruit = Fruits.Cranberry; 

Console.WriteLine(fruit); 

一個預計會輸出Cranberry,因爲這是分配的值,但實際上這會輸出Berry

這是預期的行爲?基於它們之前的值,enums會被擡起頭來,並且AfricanMango搞亂了這個任務嗎?

回答

6

如果您未指定enum項目的值,則會依次創建它們。因此在這種情況下,AfricanMango的值等於Mango,這意味着之後的值將爲Mango + 1,其映射到Berry

MSDN documentation

默認情況下,第一個枚舉的值爲0,並且每個相繼的枚舉的值增加1

+0

呃,我喜歡「我們討厭你」功能>。<這需要編譯器警告。 – PTwr

5

是,分配只是遞增。它確實取得了前一項+ 1的值。請參閱Reflector代碼:

public enum Fruits 
{ 
    AfricanMango = 4, 
    Apple = 2, 
    Banana = 0, 
    Berry = 5, 
    Cranberry = 5, // <-- uch 
    Mango = 4, 
    Peach = 3, 
    Strawberry = 1 
} 

您應該將計算值放到最後。這樣計數不會中斷,或手動分配值。

MSDN

默認情況下,第一個枚舉的值爲0,並且每個相繼的枚舉的值增加1。例如,在下面列舉,星期六是0,太陽1,Mon是2,依此類推。