2016-11-14 2 views
0

Я видел некоторый код 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

Вы получаете эту ошибку, потому что перечисление не является классом, это структура. – CathalMF

+2

Все перечисления - это структуры, поэтому 'where T: struct' будет работать с перечислениями. 'где T: enum' просто недействителен синтаксис C#. (но мы все надеемся, что когда-нибудь это изменится) –

+0

'где T: enum' не является допустимым ограничением, и все перечисления являются структурами, поэтому вы не можете использовать' where T: class'. Зачем вам вообще нужно менять ограничение? – Lee

ответ

1

Проблема, почему T : class не будет работать, потому что перечисление всегда является структурой. Таким образом, вы видите это неправильно. Вы пишете:

Enum.Result должен быть ссылочный тип ... Я думал, что класс был ссылочный тип ...

Вы правы, что класс является ссылочным типом. Но Enum.Result не является классом. Это структура, как указано выше. Ваше ограничение T : class просто принимает ссылочный тип.

Кроме того, вы не можете ввести var a = "hello world"; в свою функцию, если вы измените ограничение на T : enum, так как это ограничение недействительно. Таким образом, вы не сможете написать какой-либо действительный код в своем методе, прежде чем исправлять свое ограничение.

Посмотрите на msdn, чтобы выяснить, какие ограничения возможны.

+0

Ссылка на английский https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/constraints-on-type-parameters – thermite

1

Как говорится в комментарии, перечисление не является классом. Однако Enum есть.Это просто особый один, и если вы пытаетесь ограничить тип подобного, он не будет препятствовать вам:

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

Constraint не может быть специальный класс «Enum»

Существующий код из связанный с вами вопрос о том, что вы можете сделать, но посмотрите здесь, если вы хотите получить дополнительную информацию: Create Generic method constraining T to an Enum

Что касается второй части вашего вопроса, вместо этого вместо ограничения на класс, должно быть что-то еще там.

Редактировать - Я немой - что сказал Себи. :)

Нет Enum.Result в ваших фрагментах кода или ответа, с которым вы связались, поэтому я думаю, что нам нужно будет увидеть больше вашего кода, чтобы ответить на этот вопрос.

Смежные вопросы