我最近正在重新审视C#的一些奇怪行为,这些行为与将整数转换为现有枚举有关,其中明确分配了一些枚举整数值,并且有些按顺序分配。使用LinqPad 4,我构建了以下枚举:
public enum Hurf {
Foo,
Bar,
Derp,
Duh = 2,
Lerp,
Mur,
Dur = 3
}
在C#程序模式下使用以下主块体,执行以下转换:
Console.WriteLine((Hurf)2);
Console.WriteLine((int)Hurf.Derp);
Console.WriteLine((Hurf)3);
Console.WriteLine((int)Hurf.Lerp);
这导致以下输出:
Derp
2
Dur
3
奇怪的是,似乎在第一次演员表中,由于有两个整数值为2的项目,它默认为第一个,即#34; Derp"。使用相同的逻辑,我使用整数值3执行另一个强制转换,这次它导致SECOND值为3,这是" Dur"。
我决定在另一个项目的下方添加另一个项目" Dur" as"测试"并将其设置为0.
public enum Hurf {
Foo,
Bar,
Derp,
Duh = 2,
Lerp,
Mur,
Dur = 3,
Test = 0
}
这并没有改变第一次施法的行为,但现在第二次施放的结果是" Lerp",这与它投射到第一个值3是一致的在枚举中设置。
Duh
2
Lerp
3
由于显而易见的原因,我不会开始依赖这种类型的转换,但是很高兴知道为什么这种行为存在并且受到枚举列表底部的任意手动赋值的影响。 (另外,设置"测试"大于3的值会导致原始行为返回。)
答案 0 :(得分:8)
问题不是转换 - 它是转换为字符串表示形式。 Lerp
和Dur
具有相同的价值 - 您无法区分它们。
的确,如果你直接给他们打电话ToString()
,就像这样:
Console.WriteLine(Hurf.Lerp.ToString());
Console.WriteLine(Hurf.Dur.ToString());
...你应该期望两次看到相同的输出。它只是没有明确定义的 输出你会得到。
documentation for Enum.ToString()
明确指出:
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回的名称做出任何假设。