我检查了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”和“ 3”,但选择第二个“ 4”?这是未定义的行为,还是我遗漏了一些明显的东西?
专门记录这是未记录的行为。
编写代码的方式可能最终会每次都选择相同的东西,但是Enum.ToString的文档指出:
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值来检索枚举成员名称的字符串表示形式,则您的代码不应对方法将返回的名称进行任何假设。
(我的重点)
如评论中所述,不同的.NET运行时可能返回不同的值,但是未记录行为的整个问题是,它很容易无缘无故地(似乎)被更改。它可能会根据天气,时间,程序员的心情甚至在.NET运行时的修补程序中进行更改。您不能依赖未记录的行为。
请注意,在您的示例中,ToString
正是您要查看的内容,因为您正在打印该值,这随后会将其转换为字符串。
如果您尝试进行比较,则所有具有相同基础数字值的枚举值都是等效的,并且您无法首先确定存储在变量中的枚举值。
换句话说,如果您这样做:
var x = en.a;
之后没有办法推断出您写的内容是否en.a
与否,en.b
或者en.c
它们都比较相等,因此它们都具有相同的潜在价值。好吧,没有创建一个程序来读取自己的源代码。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句