- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近重新审视了一些 C# 的奇怪行为,这些行为与将整数转换为现有枚举有关,其中一些枚举整数值是显式分配的,一些是按顺序分配的。使用 LinqPad 4,我构建了以下枚举:
public enum Hurf {
Foo,
Bar,
Derp,
Duh = 2,
Lerp,
Mur,
Dur = 3
}
在 C# 程序模式下使用以下主 block 主体,我执行以下转换:
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
出于显而易见的原因,我一开始不会依赖这种类型的强制转换,但很高兴知道为什么存在这种行为并受到枚举列表底部任意手动分配的影响。 (此外,将“测试”设置为大于 3 的值会导致返回原始行为。)
最佳答案
问题不在于转换——而是转换为字符串表示形式。 Lerp
和 Dur
是相同的值 - 您无法区分它们。
确实,如果您直接对它们调用 ToString()
,如下所示:
Console.WriteLine(Hurf.Lerp.ToString());
Console.WriteLine(Hurf.Dur.ToString());
...您应该会看到相同的输出两次。它只是没有明确定义您将获得哪些输出。
documentation for Enum.ToString()
明确指出:
If multiple enumeration members have the same underlying value and you attempt to retrieve the string representation of an enumeration member's name based on its underlying value, your code should not make any assumptions about which name the method will return.
关于c# - C# 中不一致的枚举转换结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34715848/
我是一名优秀的程序员,十分优秀!