2010-11-19 52 views
4

我有以下通用函數:限制的通用功能,只工作在枚舉

public SomeType SomeFunction<T>(T value) 
{ 
} 

我現在想限制這種通用的功能只能Enum工作其實如此我嘗試了以下內容:

public SomeType SomeFunction<T>(T value) where T : System.Enum 
{ 
} 

,但是這導致:

錯誤CS0702:約束不能 小號特殊'系統.Enum'

是否有工作和好奇心沒有人知道爲什麼這種類型的約束是不被允許的原因?

+0

你應該看看接受的答案之前在Ani提到的愚蠢。這是C#語言的限制,而不是CLR(例如,可以限制爲F#中的enum)。 Unconstrained Melody庫提供了一種解決方法,以允許C#本身的枚舉約束:http://code.google.com/p/unconstrained-melody/ – LukeH 2010-11-19 10:47:45

回答

5

你不能。您可以將其限制爲值類型,但僅此而已。它限制爲枚舉只能使用運行時檢查來完成:

public SomeType SomeFunction<T>(T value) where T : struct 
{ 
    if (!typeof(T).IsEnum) 
    { 
     throw new NotSupportedException("Only enums are supported."); 
    } 
} 
+1

+1。還值得注意的是System.Enum不是枚舉。 – 2010-11-19 10:30:40

+0

問題是我有另一個非泛型的函數,它現在沒有被調用,因爲所有對'SomeFunction'的調用都被路由到通用版本,gah! – 2010-11-19 10:32:26

+0

你實際上可以使約束更緊一點,而不是真的有幫助:'在哪裏T:struct,IComparable,IConvertible,IFormattable' – LukeH 2010-11-19 10:32:31

1

史蒂芬是正確的,但你可以縮小它一點,你就拋出一個異常

public SomeType SomeFunction<T>(T value) where T : struct 
+2

這比史蒂文說的少。 -1 – 2010-11-19 10:32:12

+1

-1是不值得的,因爲我編輯了我的答案以後添加'where T:struct'。此編輯可能會跨過這篇文章。 – Steven 2010-11-19 11:47:04

+0

好的,但是(根據SO計時)你在Steven之後5分鐘回答。如果你說你的答案在某些時候比Steven有更多的信息,你都必須完成忍者編輯,因爲我看不到任何編輯要麼回答。對不起,如果是這樣的話。 – 2010-11-19 11:54:31