我有一些代码接受一个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某种方式弄乱了吗?
是的,分配只是增加了.它确实需要前一项+ 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,依此类推.