【问题标题】:Using enum as generic type parameter in C# [duplicate]在 C# 中使用枚举作为泛型类型参数 [重复]
【发布时间】:2011-06-22 10:27:37
【问题描述】:

可能重复:
Enum type constraints in 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# generics enums


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-04
      • 2019-01-16
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      相关资源
      最近更新 更多