打印枚举值时出现意外输出
本文关键字:意外 输出 枚举 打印 | 更新日期: 2023-09-27 18:20:36
我有一些代码采用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
的赋值是不是搞砸了?
如果没有为enum
项指定值,则会按顺序创建它们。因此在这种情况下,AfricanMango
具有与Mango
相等的值,这意味着之后的值将是映射到Berry
的Mango + 1
。
来自MSDN文档:
默认情况下,第一个枚举器的值为0,每个连续枚举器的数值增加1
是的,赋值只是递增。它确实取了上一项的值+1。请参阅反射器的代码:
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,依此类推。