如果我聲明枚舉從USHORT繼承這樣的:如何確定從ushort繼承的枚舉類型?
public enum MyEnum : ushort { A = 0, B = 1 };
,然後檢查它的類型是這樣的:
if(typeof(MyEnum) != typeof(ushort))
System.Diagnostics.Debugger.Break();
斷點被調用。這是爲什麼發生?
如果我聲明枚舉從USHORT繼承這樣的:如何確定從ushort繼承的枚舉類型?
public enum MyEnum : ushort { A = 0, B = 1 };
,然後檢查它的類型是這樣的:
if(typeof(MyEnum) != typeof(ushort))
System.Diagnostics.Debugger.Break();
斷點被調用。這是爲什麼發生?
這就是所謂的,因爲他們是不一樣的類型!一種是類型爲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
的情況,你真的想做這種比較。
出於同樣的原因,'typeof運算(字符串)!= typeof運算(對象)'。 – cdhowie 2012-07-30 21:10:38
這不是一個繼承聲明 - 它聲明瞭枚舉的基礎類型。 – Oded 2012-07-30 21:10:50
@cdhowie:不是真的......'MyEnum'並不真正從'ushort'繼承。 – 2012-07-30 21:16:02