在 C# 中使用枚举作为泛型类型参数 [重复]
Posted
技术标签:
【中文标题】在 C# 中使用枚举作为泛型类型参数 [重复]【英文标题】:Using enum as generic type parameter in C# [duplicate] 【发布时间】:2011-06-22 10:27:37 【问题描述】:可能重复:Enum type constraints in 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
类的成员和方法。那么是否可以按照我的意图实现它或者我应该使用什么其他方法?
【问题讨论】:
在 C# 7.3 中引入:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/… @Fildor 问题已关闭,我无法添加新答案。顶部链接的问题也已关闭。然后下一个链接的问题有一个答案***.com/a/50289291/617543。 :-) 【参考方案1】:不,很遗憾,这是不可能的。你能做的最好的就是使用where T : struct, IComparable, IConvertible, IFormattable
(当然不一样)。接口限制来源于System.Enum
的实现。
除此之外,你可以检查typeof(T).IsEnum
,它可以在运行时检测到问题并推测抛出异常。但是没有办法在编译时强制执行这个限制。
【讨论】:
【参考方案2】:这在 C# 的语言级别上是不可行的,但底层 CLR 支持它。您可以使用 Jon Skeet 的 Unconstrained Melody,它将生成的二进制文件转换为具有实际枚举通用约束的二进制文件。
【讨论】:
以上是关于在 C# 中使用枚举作为泛型类型参数 [重复]的主要内容,如果未能解决你的问题,请参考以下文章