2011-12-31 96 views
7

考虑下面的代码:如何约束泛型为枚举类型?

class Base<T> 
{ 
//Base members 
} 

我想通用吨至是一个枚举(如果可能的话使用约束)。我怎样才能在C#中做到这一点?

编辑:
通过阿卡什Kava- -introduced使用代码合同也似乎是一个很好的方式。我设法让它产生一个无用的运行时错误。 Here是我试过的代码。应该可以生成编译时警告,但我无法使其工作。

+1

这是重复的,对吗? – BoltClock 2011-12-31 16:42:09

+3

链接重复请? – atoMerz 2011-12-31 17:00:52

+0

很多人,但规范子里的一个我能找到的是http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum,这虽然是关于一个通用的方法,不是泛型类,类型约束的工作方式完全一样。 – BoltClock 2011-12-31 17:08:57

回答

12

这是在IL级支持,但不是在C#。你可以看看Jon Skeet写的unconstrained melody,它可以让你实现这个目标。这里是他详细解释的相应blog post

+1

在C#中没有办法感到惊讶。 :( – atoMerz 2011-12-31 16:58:44

+0

出于好奇,IL是否允许枚举约束的泛型做任何不受约束的泛型除了调用慢的'Enum.HasFlag'之外还可以做其他事情?我猜测C#团队会判断IL支持的级别对于人们想要用枚举约束的泛型做什么是没有效率的,并且认为(错误地指望恕我直言),禁止它们会比允许它们更好,但不能让它们做得更多。 – supercat 2013-01-12 17:53:32

+0

有[ExtraConstraints.Fody] (https://github.com/Fody/ExtraConstraints),以实现一个非常简单的方式,所有的IL-织。只需安装的NuGet包'Fody'和'ExtraConstraints.Fody'并添加约束的代码上所示回购。也许你想添加这个答案? – BatteryBackupUnit 2017-07-24 06:52:25