2012-09-24 245 views
0
一個泛型類型參數

可能重複:
Create Generic method constraining T to an Enum
Enum type constraints in C#System.Enum與約束

考慮下面的類:

public class Transition<TState> 
{ 
    public Transition() 
    { 
     if (!typeof(TState).IsEnum) 
      throw (new ArgumentException("[TState] has to be of type [System.Enum].")); 
    } 
} 

理想的情況下,這應該聲明爲:

public class Transition<TState> where TState: System.Enum 
{ 
} 

以上這些當然會產生編譯時錯誤。我的問題是爲什麼這是非法的。大多數消息來源解釋說,這是非法的,但不解釋原因。有什麼想法嗎?

+2

此問題已經被討論了很多次,請在發佈問題之前先搜索一下可能的重複[Create Generic method constraining T to Enum](http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum)。還有另一個愚蠢的方法:http://stackoverflow.com/questions/7244/anyone-know-a-good-workaround-for -en-enum-an-enum-generic-constraint –

+1

已經在這裏回答了http://stackoverflow.com/questions/1331739/enum-type-constraints-in-c-sharp – prashanth

+0

@DarinDimitrov:他們不是重複的這兩個問題實際上是一個Rafal指出的重複,我不是在尋找解決方法,只是尋找它背後的原因編輯:這個問題的鏈接是[這裏](http: //stackoverflow.c OM /問題/ 1331739 /枚舉類型約束式-C-尖銳)。 –

回答

3

由於Eric Lippert says這一點,我引用

所有的功能都得到執行,直到有人設計,規範,實施,測試,文檔和船舶的功能。到目前爲止,沒有人爲此做過這件事。沒有特別不尋常的原因,爲什麼不。我們還有很多其他的事情要做,預算有限,而這個從來沒有超過「這不好過嗎?」在語言設計團隊中進行討論「。

+2

如果C#團隊沒有對System.Enum作爲類型約束的可用性採取任何故意行爲,則指定'T:System.Enum'可能會用於限制可傳遞給的類型可以是'System.Enum'或枚舉類型,但不允許類使用'System.Enum'無法執行的任何操作。 C#團隊顯然決定,因爲聲明'T:enum'的人可能想要'T'不能提供的特性,所以他們應該添加代碼來明確禁止這樣的約束。 – supercat

+1

指定'System.Enum'約束的能力不是未實現的功能;爲編譯時驗證參數類型的有限目的指定'System.Enum'約束的能力是一個特性,儘管它不如理想有用,但它可以「免費」實現,但對於決定積極阻止它。 – supercat