【问题标题】:How to constraint a generic to be of type enum?如何将泛型约束为枚举类型?
【发布时间】:2011-12-31 16:32:29
【问题描述】:

考虑以下代码:

class Base<T>
{
 //Base members
}

我希望通用 T 是一个枚举(如果可能,使用约束)。我怎样才能在 C# 中做到这一点?

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

【问题讨论】:

  • 很多,但我能找到的规范之一是stackoverflow.com/questions/79126/…,虽然它是关于泛型方法,而不是泛型类,但类型约束无论如何都以完全相同的方式工作。
  • @BoltClock,感谢您的指出,但我仍然得到了一个非常不同的答案(我认为一个更好的答案)。但是,我还没有设法让它工作。
  • 你试过代码合约吗?
  • @AkashKava:从未听说过他们。有链接吗?
  • msdn.microsoft.com/en-us/devlabs/dd491992 ,这是创建警告的另一种方式..

标签: c# generics type-constraints


【解决方案1】:

这在 IL 级别受支持,但在 C# 中不支持。您可以查看由 Jon Skeet 编写的 unconstrained melody,它可以让您实现这一目标。这是对应的blog post,他详细解释了。

【讨论】:

  • 很惊讶 C# 没有办法。 :(
  • 出于好奇,IL 是否允许枚举约束泛型执行无约束泛型可以执行的任何操作,而不是调用慢速 Enum.HasFlag?我的猜测是,C# 工作人员判断 IL 支持的水平不足以满足人们对枚举约束泛型的需求,并认为(恕我直言)最好是禁止它们而不是允许它们但不让他们能够做很多事情。
  • ExtraConstraints.Fody 以非常简单的方式实现所有 IL 编织。只需安装 nuget 包 FodyExtraConstraints.Fody 并将约束添加到代码中,如 repo 中所示。也许您想将此添加到答案中?
【解决方案2】:

.NET 4.0 及以上版本,您可以使用代码合同 http://msdn.microsoft.com/en-us/devlabs/dd491992 创建警告,这将让您检查一些先决条件并向开发人员显示警告。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-25
    • 2019-08-24
    相关资源
    最近更新 更多