【问题标题】:Restricting generic function to only work on Enums [duplicate]将泛型函数限制为仅适用于枚举 [重复]
【发布时间】:2010-11-19 10:22:53
【问题描述】:

我有以下通用函数:

public SomeType SomeFunction<T>(T value)
{
}

我现在想将此通用函数限制为仅与 Enums 一起使用,因此我尝试了以下方法:

public SomeType SomeFunction<T>(T value) where T : System.Enum
{
}

但这导致:

错误 CS0702:约束不能 特殊类'System.Enum'

是否有解决方法,出于好奇,有人知道为什么不允许这种类型的约束吗?

【问题讨论】:

  • 您应该看看 Ani 提到的欺骗中接受的答案。这是 C# 语言的限制,而不是 CLR(例如,可以在 F# 中限制为 enum)。 Unconstrained Melody 库提供了一种解决方法,允许在 C# 本身中使用 enum 约束:code.google.com/p/unconstrained-melody

标签: c#


【解决方案1】:

你不能。您可以将其限制为值类型,仅此而已。将其限制为枚举只能使用运行时检查来完成:

public SomeType SomeFunction<T>(T value) where T : struct
{
    if (!typeof(T).IsEnum)
    {
        throw new NotSupportedException("Only enums are supported.");
    }
}

【讨论】:

  • +1。还值得注意的是 System.Enum 不是枚举。
  • 问题是我有另一个同名的非通用函数现在没有被调用,因为所有对 SomeFunction 的调用都被路由到通用版本,哎呀!
  • 你实际上也可以让约束更紧一点,并不是说它真的有很大帮助:where T : struct, IComparable, IConvertible, IFormattable
  • @Moo-Juice: System.Enum 不是枚举吗,和 System.ValueType 不是值类型一样吗?
  • @Matt 正确。 System.ValueType 只是值类型被装箱时的容器,因此作为通用参数是无用的。 System.Enum 就是从它派生的 :)
【解决方案2】:

Steven 是正确的,但你可以在抛出异常之前稍微缩小范围

public SomeType SomeFunction<T>(T value) where T : struct

【讨论】:

  • 这比史蒂文说的要少。 -1
  • -1 是不值得的,因为我稍后编辑了答案以添加 where T : struct。此编辑可能越过此帖子。
  • 好的,但是(根据 SO 计时)你在 Steven 之后 5 分钟回答了。如果您说您的答案在某些时候比史蒂文的信息更多,那么你们俩都必须进行忍者编辑,因为我看不到任何一个答案的任何编辑。抱歉,如果是这种情况。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-28
  • 1970-01-01
  • 2016-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多