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

Luk*_*ith 2 c# enums

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

public enum MyEnum : ushort { A = 0, B = 1 };
Run Code Online (Sandbox Code Playgroud)

然后检查它的类型如下:

if(typeof(MyEnum) != typeof(ushort))
            System.Diagnostics.Debugger.Break();
Run Code Online (Sandbox Code Playgroud)

断点被调用.为什么会这样?

Jon*_*eet 8

这是因为他们不是同一类型!一个是枚举类型,其基础值为type ushort,另一个是ushort其自身.(请注意,ushort即使它使用相同的语法,它也不是真正的"继承" - 它实际上只是说"底层类型是ushort".)

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

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

如果您正在尝试确定基础类型,则应使用Type.GetEnumUnderlyingType:

if (typeof(MyEnum).GetEnumUnderlyingType() == typeof(ushort))
{
    // Yup, the underlying type is ushort
}
Run Code Online (Sandbox Code Playgroud)

编辑:只是为了完整性,如果MyEnum真的没有继承ushort,你仍然可以测试类型的平等.正如cdhowie在评论中所说,如果你写道:

if (typeof(string) != typeof(object))
{
    Debugger.Break();
}
Run Code Online (Sandbox Code Playgroud)

仍然会进入调试器.您可能希望查看Type.IsAssignableFrom您真正想要进行此类比较的情况.