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

本文关键字:意外 输出 枚举 打印 | 更新日期: 2023-09-27 18:20:36

我有一些代码采用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

这是故意的行为吗?枚举是根据它们之前的值来查找的吗?AfricanMango的赋值是不是搞砸了?

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

如果没有为enum项指定值,则会按顺序创建它们。因此在这种情况下,AfricanMango具有与Mango相等的值,这意味着之后的值将是映射到BerryMango + 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,依此类推。