如果我声明一个继承自ushort的枚举:
public enum MyEnum : ushort { A = 0, B = 1 };
然后检查它的类型:
if(typeof(MyEnum) != typeof(ushort))
System.Diagnostics.Debugger.Break();
调用断点。为什么会这样?
答案 0 :(得分:8)
这是因为它们不是同一类型!一个是枚举类型,其基础值为ushort
,另一个是ushort
本身。 (请注意,它并非真正“继承自ushort
”,即使它使用相同的语法 - 它实际上只是说“基础类型为ushort
”。)
为什么期望他们是同一类型?如果它们实际上是同一类型,那么你将失去很多枚举类型的安全性。
打印typeof(MyEnum).Name
并获取UInt16
IMO会非常奇怪。
如果您要确定基础类型,则应使用Type.GetEnumUnderlyingType
:
if (typeof(MyEnum).GetEnumUnderlyingType() == typeof(ushort))
{
// Yup, the underlying type is ushort
}
编辑:为了完整起见,如果MyEnum
确实 继承自ushort
,您仍然会测试类型相等。正如cdhowie在评论中所说,如果你写道:
if (typeof(string) != typeof(object))
{
Debugger.Break();
}
仍然进入调试器。您可能希望查看Type.IsAssignableFrom
以了解您真正希望进行此类比较的情况。