C#7.3 Ограничение Enum: Почему я не могу использовать ключевое слово enum?



generics enums (1)

Структурное ограничение на дженерики не отображается на фактический тип (хотя теоретически оно может отображаться на ValueType ). Точно так же enum не точно отображает фактические типы так, как это делают string , int или long , он устанавливает специальный синтаксис для создания класса символических констант, которые отображаются в целочисленные значения; следовательно, public enum Stuff вместо public class Stuff : Enum . Обратите внимание, что если бы последний был реализован вместо этого, он был бы более тонким, поскольку он изменил бы синтаксис на основе унаследованного типа, а не изменил бы синтаксис на основе ключевого слова, не относящегося к class .

Итак, в заключение, да, where T : enum не предназначен для работы, потому что enum - это ключевое слово, а не псевдоним типа. Если вы действительно хотите, чтобы это работало, потому что enum по крайней мере пахнет псевдонимом типа в контексте, подобном этому, иди запросите его!

РЕДАКТИРОВАТЬ: Для некоторой исторической справки, вот вопрос от 2008 года, указывающий, что Enum не был допустимым ограничением, так как это специальный класс.

Чтобы ограничить параметр универсального типа типом 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. Это правда, что enum не сопоставляется с реальным типом, как int для Int32 , но я подумал, что он должен вести себя так же, как ограничение struct .

Я только что попал в экспериментальную ловушку функций, которая еще не полностью реализована, или это было сделано специально в спецификации (почему?)?





c#-7.3