Вопрос

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

enum MyEnum : Int32
{
    Value = 1
}

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

enum MyEnum : int
{
    Value = 1
}

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

  

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top