2017-07-20 47 views
7

我有一個枚舉,其成員具有相同的值,但是當我試圖將它們打印爲字符串時,我期望看到它使用第一個定義的值,即,對於BuyBid,它打印Buy,對於SellAsk它打印Sell,但測試顯示它看起來是隨機選擇的,因爲它既不是第一個也不是最後一個值。那爲什麼這種不一致呢?爲什麼Enum字符串值不一致?

Sample code

using System; 

public enum OrderType 
{ 
    Buy, 
    Bid = Buy, 
    Sell, 
    Ask = Sell 
} 

public class Program 
{ 
    public static void Main() 
    { 
     Console.WriteLine("Hello World"); 
     OrderType o = OrderType.Buy; 
     Console.WriteLine("{0}: {1}", (int)o, o); 
     OrderType o2 = OrderType.Bid; 
     Console.WriteLine("{0}: {1}", (int)o2, o2); 
     OrderType o3 = OrderType.Sell; 
     Console.WriteLine("{0}: {1}", (int)o3, o3); 
     OrderType o4 = OrderType.Ask; 
     Console.WriteLine("{0}: {1}", (int)o4, o4); 
    } 
} 

輸出:

Buy: 0 - Bid 
Bid: 0 - Bid 
Sell: 1 - Sell 
Ask: 1 - Sell 
+0

你問你爲什麼總是看到「出價」和「出售」,或者你在不同的運行中得到不同的答案嗎? –

+0

我的迫切問題是爲什麼它不是('買'和'賣')或('出價'和'問'),而是它們混合在一起。另外,我在不同的跑步中看不到不同的答案,我不確定是否沒有足夠的時間進行測試。 – fluter

+3

它在調用者的注意事項中提到:https://msdn.microsoft.com/en-us/library/16c1xs4z.aspx#Remarks – Slai

回答

5

而不是作爲不一致,你應該想到這作爲一個選擇的情況下正在取得任意

你已經做了一個枚舉,其中兩個枚舉值代表整數0,兩個值代表整數1.因此,當你問「什麼枚舉值與0關聯?」有兩個可能的答案。

C#的設計者可能已經回答了這個問題:

  • 拋出一個錯誤
  • 與第一次出現在聲明
  • 與去年出現在枚舉值回答枚舉值回答聲明
  • 爲任意值

語言設計者w ^回答生病有時會走「任意」路線,因爲它留下了更多的優化空間。例如,他們可以將整數映射到枚舉映射到一個散列表或其他東西,並讓查找返回最方便的內容。這可以讓他們稍後改變他們的映射策略,並返回其他東西,而不會破壞相關規範的行爲。

如果他們定義的語言產生一個對聲明順序敏感的值,它可能會給實現帶來一點負擔,並且基本結束了一個跟蹤的規則。

我實際上會預期答案是「選擇一個任意值」,所以我很高興看到C#符合我的期望。但我們都是不同的,是的,有些人會感到驚訝。 :)

相關問題