是否可以使用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
类的成员和方法。那么我可以按照我的意图实现它,或者我应该使用其他方法吗?
答案 0 :(得分:39)
不,不幸的是,这是不可能的。你能做的最好的就是使用where T : struct, IComparable, IConvertible, IFormattable
(当然不一样)。接口限制源自System.Enum
的实现。
除此之外,您可以检查是否typeof(T).IsEnum
,它可以在运行时检测到问题,并可能抛出异常。但是在编译时没有办法强制执行此限制。
答案 1 :(得分:12)
这在C#的语言级别上是不可行的,但它受到底层CLR的支持。您可以使用Jon Skeet的Unconstrained Melody,它将生成的二进制文件转换为具有实际枚举通用约束的二进制文件。