我见过一些代码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
?
答案 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,所以我认为我们需要查看更多代码来回答这个问题。