如何确定从ushort继承的枚举类型?

时间:2012-07-30 21:08:20

标签: c# enums

如果我声明一个继承自ushort的枚举:

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

然后检查它的类型:

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

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

1 个答案:

答案 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以了解您真正希望进行此类比较的情况。