如何在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"?这是未定义的行为,还是我错过了一些明显的东西?
这是专门记录为未记录的行为。
可能在代码的编写方式中,除了Enum的文档之外,每次都会选择相同的东西。ToString声明如下:
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,您的代码不应该对该方法将返回哪个名称进行任何假设。
(我强调)
正如在注释中提到的,不同的。net运行时可能会返回不同的值,但是未记录的行为的整个问题是,它很容易在没有(看似)好的理由的情况下进行更改。它可以根据天气、时间、程序员的心情,甚至是. net运行时的热修复而改变。你不能依赖于未记录的行为。
请注意,在您的示例中,ToString
正是您想要查看的,因为您正在打印值,这将反过来将其转换为字符串。
如果尝试进行比较,具有相同底层数值的所有枚举值都是相等的,并且您无法首先判断存储在变量中的是哪一个。
换句话说,如果你这样做:
var x = en.a;
之后没有办法推断你写的是en.a
而不是en.b
或en.c
,因为它们都比较相等,它们都有相同的潜在值。好吧,除非创建一个程序来读取自己的源代码。