我最近正在重新审视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的项目,它默认为第一个,即"Derp".使用相同的逻辑,我使用整数值3执行另一个转换,这次它导致SECOND值为3,即"Dur".
我决定在"Dur"正下方的枚举底部添加另一个项目作为"Test"并将其设置为0.
public enum Hurf { Foo, Bar, Derp, Duh = 2, Lerp, Mur, Dur = 3, Test = 0 }
这不会改变第一个强制转换的行为,但现在第二个强制转换的结果是"Lerp",这与它投射到枚举中设置的第一个值3是一致的.
Duh 2 Lerp 3
出于显而易见的原因,我不会依赖这种类型的转换,但是很高兴知道为什么这种行为存在并且受到枚举列表底部的任意手动赋值的影响.(另外,将"Test"设置为大于3的值会导致原始行为返回.)
这不是转换的问题 - 它是转换为字符串表示.Lerp
并且Dur
是相同的值 - 你无法区分它们.
的确,如果你ToString()
直接打电话给他们,就像这样:
Console.WriteLine(Hurf.Lerp.ToString()); Console.WriteLine(Hurf.Dur.ToString());
...你应该期望两次看到相同的输出.它只是没有明确定义您将获得哪个输出.
明确说明的文档Enum.ToString()
:
如果多个枚举成员具有相同的基础值,并且您尝试根据其基础值检索枚举成员名称的字符串表示形式,则您的代码不应对该方法将返回的名称做出任何假设.