2011-06-22 227 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,它会将生成的二进制文件转换为具有实际枚举通用约束的二进制文件。