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

Чтобы ограничить параметр универсального типа типом 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.

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

1 Ответ

0 голосов
/ 07 мая 2018

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...