2

如果我声明一个继承自 ushort 的枚举,如下所示:

public enum MyEnum : ushort { A = 0, B = 1 };

然后像这样检查它的类型:

if(typeof(MyEnum) != typeof(ushort))
            System.Diagnostics.Debugger.Break();

调用断点。为什么会这样?

4

1 回答 1

8

之所以叫它,是因为它们不是同一类型!一个是枚举类型,其基础值为 type ushort,另一个是ushort它本身。(请注意,ushort即使它使用相同的语法,它也不是真正的“继承自”——它实际上只是在说“底层类型是ushort”。)

为什么你会期望它们是同一类型?如果它们实际上是相同的类型,那么您将失去很多枚举的类型安全性。

typeof(MyEnum).Name打印并获得UInt16IMO会很奇怪。

如果您尝试确定基础类型,则应使用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您真正想要进行这种比较的情况。

于 2012-07-30T21:09:55.910 回答