2012-07-30 51 views
2

如果我聲明枚舉從USHORT繼承這樣的:如何確定從ushort繼承的枚舉類型?

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

,然後檢查它的類型是這樣的:

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

斷點被調用。這是爲什麼發生?

+0

出於同樣的原因,'typeof運算(字符串)!= typeof運算(對象)'。 – cdhowie 2012-07-30 21:10:38

+0

這不是一個繼承聲明 - 它聲明瞭枚舉的基礎類型。 – Oded 2012-07-30 21:10:50

+1

@cdhowie:不是真的......'MyEnum'並不真正從'ushort'繼承。 – 2012-07-30 21:16:02

回答

7

這就是所謂的,因爲他們是不一樣的類型!一種是類型爲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的情況,你真的想做這種比較。

+0

好吧,那麼我怎樣才能在該聲明中表示基礎值類型的ushort的枚舉? I.E如何確保枚舉值類型ushort? – Lukesmith 2012-07-30 21:16:28

+0

@盧克史密斯:看看我的編輯 - 如果這不符合你的要求,請澄清。 – 2012-07-30 21:16:53

+0

非常感謝! – Lukesmith 2012-07-30 21:19:11