使用枚举作为C#中的泛型类型参数

本文关键字:泛型类型参数 枚举 | 更新日期: 2023-09-27 18:00:05

可能重复:
C#中的枚举类型约束

是否可以通过使用其包装类Enumenum类型用作泛型参数?

我有不同的枚举:

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类的成员和方法。那么,有可能按照我想要的方式来实现它吗?或者我应该使用什么其他方法?

使用枚举作为C#中的泛型类型参数

不,不幸的是,这是不可能的。你能做的最好的事情就是使用where T : struct, IComparable, IConvertible, IFormattable(当然这是不一样的)。接口限制源于System.Enum的实现。

除此之外,您还可以检查typeof(T).IsEnum,它可以在运行时检测到问题,并可能引发异常。但是在编译时没有办法强制执行这个限制。

这在C#的语言级别是不可行的,但它受到底层CLR的支持。您可以使用Jon Skeet的Unconstrained Melody,它将生成的二进制文件转换为具有实际枚举通用约束的二进制文件。