c# - 为什么枚举字符串值不一致?

标签 c# enums .net-core

我有一个枚举,其成员具有相同的值,但是当我尝试将它们打印为字符串时,我希望看到它使用第一个定义的值,即 BuyBid 它打印 Buy,对于 SellAsk 它打印 Sell,但是测试显示它们看起来是随机选择的,因为它既不是所有值的第一个也不是最后一个。那么为什么会出现这种不一致呢?

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,两个值代表整数 1。因此,当您问“什么枚举值与 0 相关联?”时有两个可能的答案。

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

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

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

如果他们定义语言来生成一个对声明顺序敏感的值,它可能会给实现带来一点负担,基本上最终会多出一个规则来跟踪。

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

关于c# - 为什么枚举字符串值不一致?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45203883/

相关文章:

c# - JSON 数组到 Entity Framework Core 非常慢?

c# - 在 Controller 级别将自定义属性添加到遥测请求

c# - 保存到数据库时出现 InvalidOperationException

c# - Xamarin 的当前上下文中不存在名称 'Log'?

c# - 在 C# 中使用反射列出枚举中的值

database - 哪些数据库系统支持 ENUM 数据类型,哪些不支持?

c# - 如何在 .Net Core 中使用 WebClient?

c# - 在 C# 中将多个文本框文本组合成一个字符串

c++ - 是否可以确定一个类型是否是作用域枚举类型?

c# - 确保事件永远不会有超过一个订阅者