枚举参数的扩展方法必须约束到结构

时间:2016-11-14 12:24:39

标签: c# enums type-constraints

我见过一些代码https://stackoverflow.com/a/479417/1221410

它旨在获取枚举值并获取描述。相关部分是:

public static string GetDescription<T>(this T enumerationValue) where T : struct

我使用相同的代码,但令我困惑的是我无法更改约束

public static string GetDescription<T>(this T enumerationValue) where T : enum

public static string GetDescription<T>(this T enumerationValue) where T : class

出现了2个问题。

第一种是当我使用enum作为约束参数时。这应该constrain the generic parameter to an enum。如果是这样,为什么我不能输入像

这样的代码
var a = "hello world";

在函数内。这与参数无关......

我的第二个问题是,当我将约束更改为class时,上面的代码片段(var a = "hello world";)工作正常,但是当我调用该函数时,我收到错误消息

'Enum.Result' must be a reference type in order to use it as parameter 'T' in the generic type or method 'GetDescription<T>(T)'

Enum.Result must be a reference type ...我认为课程是一种参考类型......

为什么https://stackoverflow.com/a/479417/1221410的示例仅适用于struct

2 个答案:

答案 0 :(得分:1)

T : class无效的问题是因为枚举总是一个结构。所以你看错了方法。你写道:

  

Enum.Result必须是引用类型......我认为一个类是一个   参考类型......

你是对的,类是引用类型。但是Enum.Result不是一个阶级。它是如上所述的结构。您的约束T : class只接受引用类型。

此外,如果将约束更改为var a = "hello world";,则无法在函数中键入T : enum,因为此约束无效。因此,在修复约束之前,您将无法在方法中编写任何有效代码。

查看msdn以了解哪些限制是可能的。

答案 1 :(得分:1)

正如评论所说,enum不是一个类。 但是,Enum是。它只是一个特殊的,如果你试图约束那样的类型,它就不会让你:

public static string GetDescription<T>(this T enumerationValue) where T : Enum
  

约束不能是特殊课程&#39; Enum&#39;

您链接的问题中的现有代码是关于您可以做的最好的代码,但如果您想了解更多信息,请参阅此处:Create Generic method constraining T to an Enum

关于问题的第二部分,关于将其限制为“课程”的问题。相反,必须有其他东西在那里。

编辑 - 我愚蠢 - 塞比说。 :)

您的代码段或您链接的答案中没有Enum.Result,所以我认为我们需要查看更多代码来回答这个问题。