Чтобы ограничить параметр универсального типа типом enum, я ранее ограничил их следующим образом, и это было лучшее, что я мог сделать для ограничения типа 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
.
Я только что попал в экспериментальную ловушку функций, которая еще не полностью реализована, или это было сделано специально в спецификации (почему?)?