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
не исключено, что любой из них может сработать... но на самом деле это не так. Обычно это не большая проблема, но, тем не менее, интригует.