2011-06-22 177 views
32

可能重複:
Enum type constraints in C#使用枚舉作爲泛型類型參數在C#

是否有可能使用enum類型,通過使用其包裝類Enum通用放慢參數?

我有不同的枚舉:

enum errors1 { E1, E3, E8 }; 
enum errors2 { E0, E2, E9 }; 
enum errors3 { E7, E4, E5 }; 

下面的類聲明,我想我可以實現它:

public class MyErrors<T> where T : Enum 
{ 
    T enumeration; 

    public T getEnumeration() 
    { 
     return enumeration; 
    } 

    static void Main(string[] args) 
    { 

     Program<error1> p = new Program<error1>(); 
     p.getEnumeration().E1 // this call does NOT work 
    } 

然而,由於普通型爲Enum我只能訪問成員和Enum類的方法。那麼是否可以按照我的意思去實現它,或者我應該使用什麼其他方法?

回答

38

不,不幸的是,這是不可能的。你可以做的最好的是使用where T : struct, IComparable, IConvertible, IFormattable(當然這是不一樣的)。接口限制來源於System.Enum的實現。

除此之外,你可以檢查是否typeof(T).IsEnum,它可以在運行時檢測到問題,並推測會拋出異常。但在編譯時無法強制執行此限制。

12

這不適用於C#的語言級別,但它受底層CLR的支持。您可以使用Jon Skeet的Unconstrained Melody,它會將生成的二進制文件轉換爲具有實際枚舉通用約束的二進制文件。