为什么Enum字符串值不一致?

flu*_*ter 7 c# enums .net-core

我有一个enum,其成员具有相同的值,但是当我尝试将它们打印为字符串时,我希望看到它使用第一个定义的值,即for BuyBidprint Buy,以及for SellAskprint Sell,但是测试显示它看起来是随机选择的,因为它既不是所有值的第一个也不是最后一个.为什么这种不一致?

示例代码:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

Buy: 0 - Bid
Bid: 0 - Bid
Sell: 1 - Sell
Ask: 1 - Sell
Run Code Online (Sandbox Code Playgroud)

Ray*_*oal 5

你应该认为这是一种任意选择的情况,而不是不一致.

你创建了一个枚举,其中两个枚举值代表整数0,两个值代表整数1.所以当你问"什么枚举值与0相关?" 有两个可能的答案.

C#的设计者可以通过以下方式回答这个问题:

  • 抛出一个错误
  • 回答声明中首先出现的枚举值
  • 回答声明中最后出现的枚举值
  • 回答任意值

语言设计师有时会走"任意"路线,因为它为优化留下了更多空间.例如,他们可以将整数到枚举映射放在哈希表或其他东西中,让查找返回最方便的内容.这允许他们稍后改变他们的映射策略并返回其他东西,而不会破坏相对于规范的行为.

如果他们定义语言以产生对声明顺序敏感的值,则可能会给实现带来一点负担,并且基本上还有一个规则需要跟踪.

我实际上希望答案是"选择任意值",所以我很高兴看到C#符合我的期望.但我们都不同,是的,有些人会感到惊讶.:)