C # int, Int32 и перечисления - PullRequest
33 голосов
/ 28 ноября 2009

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

enum MyEnum : Int32
{
    Value = 1
}

... не компилируется? Где, как

enum MyEnum : int
{
    Value = 1
}

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

Ответы [ 2 ]

30 голосов
/ 28 ноября 2009

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

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

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

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

14 голосов
/ 28 ноября 2009

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

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

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

...