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

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

enum MyEnum : Int32
{
    Value = 1
}

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

enum MyEnum : int
{
    Value = 1
}

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

2 ответа

Решение

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

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

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

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

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

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

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

Другие вопросы по тегам