C# int, Int32 и перечисления

Если int является синонимом Int32, почему

enum MyEnum : Int32
{
    Value = 1
}

... не компилируется? В то время как

enum MyEnum : int
{
    Value = 1
}

будет, даже если при наведении курсора на слово int будет отображаться struct System.Int32?


person Community    schedule 28.11.2009    source источник
comment
Какая ошибка во время компиляции?   -  person Donnie    schedule 28.11.2009
comment
@Donnie: введите byte, sbyte, short, ushort, int, uint, long или ulong. По-видимому, ограничение в .Net вынуждает пользователя использовать в перечислении только ключевые слова вместо имен классов.   -  person Webleeuw    schedule 28.11.2009
comment
Интересный. Кое-что узнал, ура!   -  person Donnie    schedule 28.11.2009
comment
Это похоже на ошибку либо в С#, либо в спецификации. Я вызываю Эрика Липперта для объяснения!   -  person Tamas Czinege    schedule 29.11.2009
comment
Компилятор правильно реализует спецификацию, и MS считает спецификацию правильной, поэтому это не ошибка, а просто неинтуитивное поведение. А это значит, что в ближайшее время вряд ли что-то исправят.   -  person Michael Edenfield    schedule 22.03.2012
comment
это меня раздражает.   -  person Sharky    schedule 11.08.2016
comment
неинтуитивное поведение исчезло, см. stackoverflow.com/questions/37589056/   -  person Mafii    schedule 16.08.2017


Ответы (2)


Базовый тип действительно один и тот же, но компилятор зависит от типа, который должен быть точным псевдонимом. Это ошибка компиляции, основанная на синтаксическом анализе. Я взглянул на спецификацию грамматики С# и основные типы, определенные там как токены на основе псевдонима (например, «int», «unit» и т. д.). Синтаксический анализатор ожидает определенные строки из грамматического правила интегральные типы.

Ошибка является ошибкой синтаксического анализа, несмотря на то, что оба enum Enum : int означают то же самое, что и enum Enum : Int32.

Я не знаю причину принудительного ограничения этого шага синтаксического анализа, но я могу попытаться угадать: поскольку Int32 не является ключевым словом, оно может относиться к чему-то другому, фактической структуре int. Если синтаксический анализатор должен знать тип, чтобы построить разные AST для каждого базового типа, он не может зависит от токена, который не является ключевым словом.

Несмотря на то, что спецификация C# определяет ключевое слово int как явный псевдоним System.Int32, получить эту информацию о явном типе (Int32) на этапе синтаксического анализа по-прежнему сложно, поскольку требует много контекстной информации, которая не может быть выведена на этом этапе.

person Elisha    schedule 28.11.2009
comment
См. также эту ошибку MS Connect, где они объясняют причину отказа от изменения bahvior: псевдоним-типа-значения-например-короткий-int-длинный-вместо-сетевого-типа-значения-например-система-int16-система-int32-система-int64" rel="nofollow noreferrer">connect.microsoft.com/VisualStudio /feedback/details/557064/ - person Michael Edenfield; 22.03.2012
comment
@MichaelEdenfield, что ссылки Microsoft Connect недоступны. Можете ли вы оформить заказ, он должен быть виден публично? Я получаю эту ошибку The content that you requested cannot be found or you do not have permission to view it. If you believe you have reached this page in error, click the Help link at the top of the page to report the issue and include this ID in your e-mail: e4c85df6-9343-4045-88d2-fc2d64bd01de - person Jeroen Wiert Pluimers; 06.03.2013
comment
Нет, к сожалению, срок действия ссылок для подключения истекает после определенных моментов. Суть ошибки заключалась в том, что int — это ключевое слово, а Int32 — это тип, а синтаксический анализатор в настоящее время ожидает допустимое ключевое слово в качестве базового типа перечисления. Изменение поведения требует изменения порядка шагов замены ключевого слова на тип по сравнению с шагами синтаксического анализа типа enum и является большим изменением для крошечной, крошечной выгоды, поэтому, скорее всего, этого не произойдет (если не произойдет других связанных изменений). в том же районе) - person Michael Edenfield; 06.03.2013
comment
Спасибо. Нашел другой: он помечен как не исправленный: connect.microsoft.com/VisualStudio/feedback/details/737759/ - person Jeroen Wiert Pluimers; 07.03.2013
comment
Работает сейчас, см. stackoverflow.com /вопросы/37589056/ - person Mafii; 16.08.2017

Знакомое любопытство... спецификация языка гласит (14.1):

Объявление enum может явно объявлять базовый тип byte, sbyte, short, ushort, int, uint, long или ulong. Обратите внимание, что char нельзя использовать в качестве базового типа. Объявление перечисления, которое явно не объявляет базовый тип, имеет базовый тип int.

Но поскольку int обычно просто псевдоним для System.Int32, не необоснованно думать, что любой из них может работать... но на самом деле это не так. . Обычно это не большая проблема, но, тем не менее, интригующая.

person Marc Gravell    schedule 28.11.2009