考虑下面的代码:如何约束泛型为枚举类型?
class Base<T>
{
//Base members
}
我想通用吨至是一个枚举(如果可能的话使用约束)。我怎样才能在C#中做到这一点?
编辑:
通过阿卡什Kava- -introduced使用代码合同也似乎是一个很好的方式。我设法让它产生一个无用的运行时错误。 Here是我试过的代码。应该可以生成编译时警告,但我无法使其工作。
考虑下面的代码:如何约束泛型为枚举类型?
class Base<T>
{
//Base members
}
我想通用吨至是一个枚举(如果可能的话使用约束)。我怎样才能在C#中做到这一点?
编辑:
通过阿卡什Kava- -introduced使用代码合同也似乎是一个很好的方式。我设法让它产生一个无用的运行时错误。 Here是我试过的代码。应该可以生成编译时警告,但我无法使其工作。
这是在IL级支持,但不是在C#。你可以看看Jon Skeet写的unconstrained melody,它可以让你实现这个目标。这里是他详细解释的相应blog post。
在C#中没有办法感到惊讶。 :( – atoMerz 2011-12-31 16:58:44
出于好奇,IL是否允许枚举约束的泛型做任何不受约束的泛型除了调用慢的'Enum.HasFlag'之外还可以做其他事情?我猜测C#团队会判断IL支持的级别对于人们想要用枚举约束的泛型做什么是没有效率的,并且认为(错误地指望恕我直言),禁止它们会比允许它们更好,但不能让它们做得更多。 – supercat 2013-01-12 17:53:32
有[ExtraConstraints.Fody] (https://github.com/Fody/ExtraConstraints),以实现一个非常简单的方式,所有的IL-织。只需安装的NuGet包'Fody'和'ExtraConstraints.Fody'并添加约束的代码上所示回购。也许你想添加这个答案? – BatteryBackupUnit 2017-07-24 06:52:25
.NET 4.0起,您可以创建通过使用代码契约,http://msdn.microsoft.com/en-us/devlabs/dd491992警告,这将让你检查一些先决条件,并显示警告开发者。
这是重复的,对吗? – BoltClock 2011-12-31 16:42:09
链接重复请? – atoMerz 2011-12-31 17:00:52
很多人,但规范子里的一个我能找到的是http://stackoverflow.com/questions/79126/create-generic-method-constraining-t-to-an-enum,这虽然是关于一个通用的方法,不是泛型类,类型约束的工作方式完全一样。 – BoltClock 2011-12-31 17:08:57