在C#中将枚举用作通用类型参数

37

可能是重复问题:
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 类的成员和方法。那么是否有可能按照我原来的方式实现它,或者应该使用什么其他方法?


5
C# 7.3 中引入了:https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters#enum-constraints - Tomas Karban
1
@Fildor 这个问题已经关闭,我无法添加新的答案。顶部链接的问题也已关闭。然后下一个链接的问题有一个答案 https://dev59.com/IHVD5IYBdhLWcg3wWaRh#50289291. :-) - Tomas Karban
2个回答

43
很遗憾,不可能实现。最好的方法是使用 where T : struct, IComparable, IConvertible, IFormattable(当然这并不是完全相同的)。接口限制源于 System.Enum 的实现。
此外,您可以检查 typeof(T).IsEnum,以在运行时检测问题并可能抛出异常。但无法在编译时强制执行此限制。

12

在C#语言层面上无法实现,但底层CLR支持此操作。您可以使用Jon Skeet的Unconstrained Melody,它可以将生成的二进制文件转换为具有实际枚举泛型约束的文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接