【问题标题】:System.Enum as a generic type parameter with constraints [duplicate]System.Enum 作为具有约束的泛型类型参数[重复]
【发布时间】:2012-09-24 05:40:08
【问题描述】:

可能重复:
Create Generic method constraining T to an Enum
Enum type constraints in C#

考虑以下类:

public class Transition<TState>
{
    public Transition ()
    {
        if (!typeof(TState).IsEnum)
            throw (new ArgumentException("[TState] has to be of type [System.Enum]."));
    }
}

理想情况下,这应该声明为:

public class Transition<TState> where TState: System.Enum
{
}

上述内容当然会产生编译时错误。我的问题是为什么这被定为非法。大多数消息来源解释说这是非法的,但没有解释原因。有什么想法吗?

【问题讨论】:

  • 这个话题已经讨论过很多次了。请在发布问题之前进行搜索。 Create Generic method constraining T to an Enum 的可能重复项。还有一个骗子:stackoverflow.com/questions/7244/…
  • @DarinDimitrov:它们不是这两个问题的重复。事实上,它是 Rafal 指出的那个的副本。我不是在寻找解决方法。只是在寻找它背后的原因。编辑:该问题的链接是here
  • @RaheelKhan,这个功能是在 CIL 级别实现的,只是没有在 C# 中实现。如果您阅读我的第二个欺骗链接,您会发现有一个解决方法,正如 Jon Skeet 所说明的那样,他写了一个好帮手。看看他的博文:msmvps.com/blogs/jon_skeet/archive/2009/09/11/1722426.aspx
  • 我知道这很有帮助。如果您在发布问题之前进行了搜索,那将是谷歌的第一次或第二次点击。下次请这样做。

标签: c# .net generics enums constraints


【解决方案1】:

正如Eric Lippert says 那和我引用的那样

在有人设计、规范、实施、测试、记录和发布该功能之前,所有功能都未实现。到目前为止,没有人为此做过。没有什么特别不寻常的理由。我们还有很多其他事情要做,预算有限,而这件事从来没有超过“这不是很好吗?”语言设计团队的讨论。”

【讨论】:

  • 如果 C# 团队没有对 System.Enum 作为类型约束的可用性采取任何刻意的行动,那么指定 T:System.Enum 可能会起到限制可以传递的类型的作用可以是System.Enum 或枚举类型,但不允许类对T 做任何它不能用System.Enum 做的事情。 C# 团队显然决定,既然声明 T:enum 的人可能想要 T 无法提供的功能,他们应该添加代码以明确禁止这样的约束。
  • 指定System.Enum 约束的功能并不是一开始就未实现的功能;为编译时验证参数类型的有限目的指定System.Enum 约束的能力是一个功能,虽然它的用处不如理想,但可以“免费”实现,但要决定主动阻止它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-05
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-22
相关资源
最近更新 更多