2017-07-20 50 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#符合我的期望。但我们都是不同的,是的,有些人会感到惊讶。 :)

相关问题