打印枚举值时出现意外输出

aev*_*tas 4 c# enums

我有一些代码接受一个ulong参数,并通过使用映射字典,将ulong映射到一个值enum.但是,枚举包含的值对于所有意图都是相同的,因此稍后将以与以下枚举中类似的方式在枚举中重新分配这些值AfricanMango:

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

    AfricanMango = Mango,

    Cranberry
}
Run Code Online (Sandbox Code Playgroud)

应该告诉编译器对两者使用相同的值,AfricanMango并且Mango从设计的角度来看这个实现是否真的有意义.

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

但是,随后使用该函数(调试器的结果,当要求保护的Fruits.Cranberry),其结果突然偏移到Fruits.Berry,因为可以通过运行下面的代码来证明:

var fruit = Fruits.Cranberry;

Console.WriteLine(fruit);
Run Code Online (Sandbox Code Playgroud)

人们会期望这会输出Cranberry,因为这是它所分配的值,但实际上这是输出Berry.

这是预期的行为吗?枚举是根据它们之前的值来查找的,并且是以AfricanMango某种方式弄乱了吗?

Dav*_*idG 6

如果您没有为enum商品指定值,则会按顺序创建它们.所以在这种情况下AfricanMango有一个等价Mango的值意味着后面的值将Mango + 1映射到Berry.

MSDN文档:

默认情况下,第一个枚举数的值为0,每个连续枚举数的值增加1


Pat*_*man 5

是的,分配只是增加了.它确实需要前一项+ 1的值.请参阅Reflector中的代码:

public enum Fruits
{
    AfricanMango = 4,
    Apple = 2,
    Banana = 0,
    Berry = 5,
    Cranberry = 5, // <-- uch
    Mango = 4,
    Peach = 3,
    Strawberry = 1
}
Run Code Online (Sandbox Code Playgroud)

你应该把计算值放在最后.这样,计数不会中断,或手动分配值.

来自MSDN:

默认情况下,第一个枚举数的值为0,每个连续枚举数的值增加1.例如,在下面的枚举中,Sat为0,Sun为1,Mon为2,依此类推.