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

C# 在C中使用枚举作为泛型类型参数#,c#,generics,enums,C#,Generics,Enums,可能重复: 是否可以使用其包装类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()

可能重复:

是否可以使用其包装类
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
   }
公共类MyErrors,其中T:Enum
{
T计数;
公共T getEnumeration()
{
返回枚举;
}
静态void Main(字符串[]参数)
{
程序p=新程序();
p、 getEnumeration().E1//此调用无效
}

但是,由于一般类型是
Enum
,我只能访问
Enum
类的成员和方法。那么是否可以按照我的意思实现它,或者应该使用什么其他方法呢?

不,不幸的是不可能。最好使用
where T:struct,IComparable,IConvertible,IFormattable
(当然不同)。接口限制源自的实现


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

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

在C#7.3中引入:@Fildor问题关闭后,我无法添加新答案。顶部链接的问题也关闭。然后下一个链接的问题有答案。:-)