如何在c#中解决模棱两可的枚举值

本文关键字:模棱两可 枚举 解决 | 更新日期: 2023-09-27 18:13:59

我检查了c#语言规范中关于枚举的部分,但无法解释以下代码的输出:

enum en {
    a = 1, b = 1, c = 1,
    d = 2, e = 2, f = 2,
    g = 3, h = 3, i = 3,
    j = 4, k = 4, l = 4
}
en[] list = new en[] {
    en.a, en.b, en.c,
    en.d, en.e, en.f,
    en.g, en.h, en.i,
    en.j, en.k, en.l
};
foreach (en ele in list) {
    Console.WriteLine("{1}: {0}", (int)ele, ele);
}

输出:

c: 1
c: 1
c: 1
d: 2
d: 2
d: 2
g: 3
g: 3
g: 3
k: 4
k: 4
k: 4

现在,为什么它会选择第三个"1",第一个"2"answers"3",而第二个"4"?这是未定义的行为,还是我错过了一些明显的东西?

如何在c#中解决模棱两可的枚举值

这是专门记录为未记录的行为。

可能在代码的编写方式中,除了Enum的文档之外,每次都会选择相同的东西。ToString声明如下:

如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,您的代码不应该对该方法将返回哪个名称进行任何假设。

(我强调)

正如在注释中提到的,不同的。net运行时可能会返回不同的值,但是未记录的行为的整个问题是,它很容易在没有(看似)好的理由的情况下进行更改。它可以根据天气、时间、程序员的心情,甚至是. net运行时的热修复而改变。你不能依赖于未记录的行为

请注意,在您的示例中,ToString正是您想要查看的,因为您正在打印值,这将反过来将其转换为字符串。

如果尝试进行比较,具有相同底层数值的所有枚举值都是相等的,并且您无法首先判断存储在变量中的是哪一个。

换句话说,如果你这样做:

var x = en.a;

之后没有办法推断你写的是en.a而不是en.ben.c,因为它们都比较相等,它们都有相同的潜在值。好吧,除非创建一个程序来读取自己的源代码。