2009-02-11 102 views

回答

2

最近的約束是結構:

C類< E>其中E:/ * *枚舉/結構

如果您需要確保它是一個枚舉使用typeof運算(E).IsEnum

5

您不能直接在C#中執行此操作 - 枚舉類型不可用作約束。一個選項(蹩腳的)是使用類型初始值設定項(靜態構造函數)在運行時進行檢查。它會在運行時使用不合適的類型停止它,但不會在編譯時。

class Foo<T> where T : struct { 
    static Foo() { 
     if (!typeof(T).IsEnum) { 
      throw new InvalidOperationException("Can only use enums"); 
     } 
    } 
    public static void Bar() { } 
} 
enum MyEnum { A, B, C } 
static void Main() { 
    Foo<MyEnum>.Bar(); // fine 
    Foo<int>.Bar(); // error 
} 
+0

這可能是.net有時令人沮喪的侷限 - 特別是因爲Enum不是唯一被排除在外的類型在約束中使用 - 也是:System.Delegate,System.Array和System.ValueType。 – LBushkin 2009-06-12 17:58:30

0

既然你說你不能使用的限制,它來到我的腦海裏唯一的其他解決方案是使用動態轉換,並在運行時檢查結果。從使用約束作爲解決方案來看,這是最差的。但是,here您可以找到可能有所幫助的文章。

相關問題