我有一些代码采用ulong
参数,并且通过使用映射字典,将ulong映射到enum
中的值。但是,枚举包含的值对于所有意图都是相同的,因此稍后会在枚举中以与AfricanMango
类似的方式重新分配这些值在以下枚举中:
public enum Fruits
{
Banana = 0,
Strawberry,
Apple,
Peach,
Mango,
Berry,
AfricanMango = Mango,
Cranberry
}
这个应告诉编译器对AfricanMango
和Mango
使用相同的值,无论从设计的角度来看这个实现是否真的有意义了空气。
我的代码将输入转换为枚举值就好了,在评估函数的结果时,它返回Fruits.Cranberry
。这是我期待的价值。
但是,当随后使用该函数的结果(调试器声明的结果为Fruits.Cranberry
)时,结果突然转移到Fruits.Berry
,这可以通过运行来证明以下代码:
var fruit = Fruits.Cranberry;
Console.WriteLine(fruit);
人们会希望这会输出Cranberry
,因为这是它所分配的值,但实际上这会输出Berry
。
这是预期的行为吗?枚举是否会根据它们之前的值进行查找,而AfricanMango
是否会以某种方式搞乱这个问题?
答案 0 :(得分:6)
如果您没有为enum
项指定值,则会按顺序创建它们。因此,在这种情况下,AfricanMango
的值等于Mango
,这意味着之后的值将Mango + 1
映射到Berry
。
默认情况下,第一个枚举数的值为0,每个连续的枚举数的值增加1
答案 1 :(得分: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.例如,在下面的枚举中,Sat为0,Sun为1,Mon为2,依此类推。