Чтобы ограничить параметр универсального типа типом перечисления, я ранее ограничивал их таким образом, что было лучшим, что я мог сделать для ограничения типа T для перечислений в до-C # 7.3:
void DoSomething<T>() where T : struct, IComparable, IConvertible, IFormattable
Теперь в C # 7.3 добавлена новая функция, ограничивающая общий тип System.Enum
. Я пробовал использовать ограничение enum в обновлении VS2017 15.7, выпущенном сегодня, и он успешно компилируется, когда я пишу его так (учитывая, что у меня есть директива using System;
):
void DoSomething<T>() where T : Enum
Однако использование ключевого слова enum
не работает и заставляет компилятор выдавать следующие ошибки (есть еще ошибки, ожидающие тела метода, но я думаю, что здесь не стоит упоминать):
void DoSomething<T>() where T : enum
^ error CS1031: Type expected
error CS1002: ; expected
^ error CS1001: Identifier expected
error CS1514: { expected
error CS1513: } expected
Поскольку для структур работает ограничение struct
, я не понимаю, почему enum
здесь не работает для перечислений. Это правда, что enum
не отображается на фактический тип, как int
для Int32
, но я думал, что он должен вести себя так же, как ограничение struct
.
Я просто попал в ловушку экспериментальной функции, которая еще не полностью реализована, или это было сделано специально в спецификации (почему?)?
string
является псевдонимом для типаString
, это неверно для ключевого словаenum
и типаEnum
. - person   schedule 07.05.2018struct
также не является псевдонимом для определенного типа, но возможно. - person Ray   schedule 07.05.2018struct
предназначен для типов значений, а не только для структуры, аналогичноclass
для всех ссылочных типов - person Mrinal Kamboj   schedule 07.05.2018enum
должен был поступить так же. О вашей ссылке: с C # 7.3 использованиеEnum
(а не ключевое словоenum
) было бы лучшим решением. Вопрос только в том, почему ключевое слово не предназначено для работы (на данный момент). - person Ray   schedule 07.05.2018