枚举类型的值

28

我只是想知道为什么会得到这个输出:

enum MyEnum
{
    a=1,
    b=2,
    c=3,
    d=3,
    f=d
}
Console.WriteLine(MyEnum.f.ToString());

输出
c


但在Mono中
输出
f

那么为什么输出是 c 而不是 d?编译器是如何选择 c 的?如果我更改代码如下:

enum MyEnum
{
    a=1,
    b=2,
    c=3,
    d=3, 
    k=3
}
Console.WriteLine(MyEnum.k.ToString());


输出
c
再次!

另一个例子:

enum MyEnum
{
    a=3,
    b=3,
    c=3,      
    d=3,
    f=d,   
}
MessageBox.Show(MyEnum.f.ToString());

输出
c


1
非常好的问题,我也在想。也许因为它是第一个? - Zhanger
2
只是为了确认一下:你知道你已经给“c”赋值为3了吗? - Reddog
1
+1 好问题,我正在等待了解动机。 - The Mask
你在 Mono 上测试过吗?它听起来像是编译器的真实行为。在你的第一个例子中,我得到了 f 而不是 c - cat916
不,我不这么认为,我们得到了值“f”,这将更具语义化。 - cat916
显示剩余4条评论
2个回答

36

来自 MSDN:

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

参见:http://msdn.microsoft.com/en-us/library/a0h36syw.aspx#Y300


(说明:该段文字是关于MSDN中枚举类型的说明,若有多个枚举成员拥有相同的底层值,程序不能保证根据该值得到正确的名称,程序需要格外谨慎处理。)

9
没有 [Flags] 标记的枚举类型使用二分查找算法来高效地找到具有指定值的第一个枚举名称,因此看起来枚举名称的选择是随机的。 - Rick Sladkey

0

输出结果为 c,因为 ToString 解析枚举的索引并打印出该索引处的表示形式。在第一个示例中,d=3,第三个索引的枚举值为 c。同样,在查找 k 的第三个索引时,它先到达 c,然后才是 k,因此再次输出 c。


这看起来不准确。根据您的解释,这个enum MyEnum {a=1,b=2,c=3,d=2,f=d}应该打印出b,但实际上打印出了f - Icarus
从技术上讲,它并不像那样索引。它只是碰巧方法看到的第一个具有相同值的名称是“c”。 - Jeff Mercado
2
这不是它的工作方式...这只是在这个例子中碰巧发生的情况。尝试 a=3, b=3, c=7, d=3, f=d。打印出 f。设置 c=2,然后打印出 d - Rob

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接