2015-11-05 43 views
4

我有一些代码需要ulong参数,并且通过使用映射字典将ulong映射到enum中的值。然而,枚举包含对于所有意图的目的相同的值,所以这些都是以类似的方式在枚举重新分配后作为AfricanMango在以下枚举:打印枚举值时发生意外输出

public enum Fruits 
{ 
    Banana = 0, 
    Strawberry, 
    Apple, 
    Peach, 
    Mango, 
    Berry, 

    AfricanMango = Mango, 

    Cranberry 
} 

应该告诉编译器对AfricanMangoMango使用相同的值,从设计的角度来看,这种实现是否真的有意义。

我的代码正在将输入转换为枚举值,并且在评估函数的结果时返回了Fruits.Cranberry。这是我期待的价值。

然而,当随后使用该函数的结果(这在调试器权利Fruits.Cranberry),结果突然偏移到Fruits.Berry,如可以通过运行下面的代码来证明:

var fruit = Fruits.Cranberry; 

Console.WriteLine(fruit); 

一个预计会输出Cranberry,因为这是分配的值,但实际上这会输出Berry

这是预期的行为?基于它们之前的值,enums会被抬起头来,并且AfricanMango搞乱了这个任务吗?

回答

6

如果您未指定enum项目的值,则会依次创建它们。因此在这种情况下,AfricanMango的值等于Mango,这意味着之后的值将为Mango + 1,其映射到Berry

MSDN documentation

默认情况下,第一个枚举的值为0,并且每个相继的枚举的值增加1

+0

呃,我喜欢“我们讨厌你”功能>。<这需要编译器警告。 – PTwr

5

是,分配只是递增。它确实取得了前一项+ 1的值。请参阅Reflector代码:

public enum Fruits 
{ 
    AfricanMango = 4, 
    Apple = 2, 
    Banana = 0, 
    Berry = 5, 
    Cranberry = 5, // <-- uch 
    Mango = 4, 
    Peach = 3, 
    Strawberry = 1 
} 

您应该将计算值放到最后。这样计数不会中断,或手动分配值。

MSDN

默认情况下,第一个枚举的值为0,并且每个相继的枚举的值增加1。例如,在下面列举,星期六是0,太阳1,Mon是2,依此类推。