为什么在 C# 中对通用枚举扩展方法使用“where T: struct”?

voi*_*ter 4 c#

我已经看到 C# 中用于枚举的通用扩展方法的示例where T: struct,还有另一个使用where T: IComparable. 例如,在前一种情况下:

public static class EnumExtensionMethods
{
  public static string Description<T>(this T enumValue) where T : struct
  {
    // ...
  }
}
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么约束要求该类型T必须是struct. 我希望它是where T : Enum。谁可以给我解释一下这个?作为奖励项目,也许还可以解释为什么IComparable在某些示例中也使用。

FWIW,我对此进行了研究。我可以找到关于为什么IComparable使用的解释,例如在这个问题中,但它似乎不是决定性的,它们也没有解释为什么struct结合使用。

Jon*_*eet 18

我怀疑您正在查看一些在 C# 7.3 之前编写的代码 - 使用EnumDelegate仅在 C# 7.3 中引入的限制泛型类型参数的能力。

但对于扩展方法针对枚举,你会希望 Enumstruct在约束,如

public static string GetDescription<T>(this T enumValue) where T : struct, Enum
{
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这样它只能在具体的枚举类型上调用,而不是GetDescription<Enum>(null).

  • @void.pointer:抱歉,我假设您已经了解 C# 级别的枚举,与泛型分开。枚举始终是值类型(尽管 System.Enum 类型不是)。“struct”约束确保类型参数是值类型;组合的“where T : struct, Enum”约束确保它是“从 System.Enum 派生的值类型” - 基本上“它是特定的枚举类型”。 (3认同)