C# 如何将泛型约束为enum类型?

C# 如何将泛型约束为enum类型?,c#,generics,type-constraints,C#,Generics,Type Constraints,考虑以下代码: class Base<T> { //Base members } 类基 { //基本成员 } 我希望泛型T是一个枚举(如果可能,使用约束)。我怎样才能在C#中做到这一点 编辑: 使用代码契约(由Akash Kava引入)似乎也是一种不错的方法。我设法让它产生了一个运行时错误,这是无用的这是我试过的密码。应该可以生成编译时警告,但我无法让它工作。这在IL级别受支持,但在C#中不受支持。你可以看看Jon Skeet的作品,它让你实现了这一目标。下面是他详细解释的相应

考虑以下代码:

class Base<T>
{
 //Base members
}
类基
{
//基本成员
}
我希望泛型T是一个枚举(如果可能,使用约束)。我怎样才能在C#中做到这一点

编辑:

使用代码契约(由Akash Kava引入)似乎也是一种不错的方法。我设法让它产生了一个运行时错误,这是无用的这是我试过的密码。应该可以生成编译时警告,但我无法让它工作。

这在IL级别受支持,但在C#中不受支持。你可以看看Jon Skeet的作品,它让你实现了这一目标。下面是他详细解释的相应位置。

.NET 4.0以后,您可以使用代码契约创建警告,这将允许您检查一些先决条件并向开发人员显示警告。

令人惊讶的是,在C中没有办法:(出于好奇,IL是否允许受枚举约束的泛型执行任何非受约束泛型可以执行的操作,而不是调用缓慢的
enum.HasFlag
?我的猜测是,C#crew判断IL支持的级别不足以满足人们对受枚举约束的泛型的需求,并认为(被误导的IMHO)最好是不允许他们,而不是允许他们,但不能让他们做太多。有一个非常简单的方法来实现所有的IL编织。只需安装nuget包
Fody
ExtraConstraints.Fody
,并将约束添加到代码中,如repo所示。也许您希望将其添加到ans中wer?有很多,但我能找到的其中一个规范是,虽然它是关于泛型方法,而不是泛型类,但类型约束的工作方式完全相同。@BoltClock,谢谢你指出,但我仍然得到了一个非常不同的答案(我认为是更好的答案).但是,我还是没能让它发挥作用。你试过代码契约吗?@AkashKava:从没听说过。有链接吗?这是一种创建警告的替代方法。。