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