Я видел некоторый код 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
?
Вы получаете эту ошибку, потому что перечисление не является классом, это структура. – CathalMF
Все перечисления - это структуры, поэтому 'where T: struct' будет работать с перечислениями. 'где T: enum' просто недействителен синтаксис C#. (но мы все надеемся, что когда-нибудь это изменится) –
'где T: enum' не является допустимым ограничением, и все перечисления являются структурами, поэтому вы не можете использовать' where T: class'. Зачем вам вообще нужно менять ограничение? – Lee