【发布时间】:2016-01-11 07:03:56
【问题描述】:
我最近重新审视了 C# 的一些奇怪行为,这些行为与将整数转换为现有枚举相关,其中一些枚举整数值是显式分配的,而一些是按顺序分配的。使用 LinqPad 4,我构建了以下枚举:
public enum Hurf {
Foo,
Bar,
Derp,
Duh = 2,
Lerp,
Mur,
Dur = 3
}
在 C# 程序模式下使用以下 Main 块体,我执行以下转换:
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”正下方的枚举底部添加另一个项目作为“测试”并将其设置为0。
public enum Hurf {
Foo,
Bar,
Derp,
Duh = 2,
Lerp,
Mur,
Dur = 3,
Test = 0
}
这不会改变第一次转换的行为,但现在第二次转换的结果是“Lerp”,这与它转换为枚举中设置的第一个值 3 是一致的。
Duh
2
Lerp
3
出于显而易见的原因,我不会一开始就依赖这种类型的转换,但很高兴知道为什么会存在这种行为并且会受到枚举列表底部的任意手动分配的影响。 (此外,将“Test”设置为大于 3 的值会导致返回原始行为。)
【问题讨论】: