Подтвердить что ты не робот

Почему я не могу использовать перечисление UInt16?

С учетом кода ниже:

static void Main()
{
    Console.WriteLine(typeof(MyEnum).BaseType.FullName);
}

enum MyEnum : ushort
{
    One = 1,
    Two = 2
}

Он выводит System.Enum, что означает, что двоеточие здесь не имеет ничего общего с наследованием, и оно просто указывает основной тип перечисления, правильно ли я?

Но если я изменю свой код следующим образом:

enum MyEnum : UInt16
{
    One = 1,
    Two = 2
}

Я получаю ошибку компиляции. Зачем? Не UInt16 и ushort то же самое?

4b9b3361

Ответ 1

Вы правы, что отражение не сообщает, что перечисление наследует базовый тип, который спецификация называет "базовым типом". Вы можете найти его, используя Enum.GetUnderlyingType.

Тип, названный ushort и System.UInt16, точно такой же.

Однако синтаксис enum не вызывает тип. Вместо этого он требует одного из ограниченного набора ключевых слов, которые управляют базовым типом. Хотя System.UInt16 является допустимым базовым типом, он не является одним из ключевых слов, которое может разрешить грамматика С# в этом месте.

Цитата грамматика:

перечислимую декларация:

attributes opt enum-modifiers opt enum идентификатор enum-base opt enum-body ; <суб > неавтоматическогосуб >

перечисление-основа:

: интегральный тип

интегрального типа:

sbyte

     

byte

     

short

     

ushort

     

int

     

uint

     

long

     

ulong

     

char

Ответ 2

Поскольку допустимые типы для перечисления явно указаны как интегральные типы (кроме char).

Утвержденные типы для перечисления являются байтами, sbyte, short, ushort, int, uint, long или ulong.

http://msdn.microsoft.com/en-us/library/sbbt4032.aspx

Можно было бы ожидать, что UInt16 будет эквивалентен ushort с учетом документации для встроенных типов:

Ключевые слова С# и их псевдонимы взаимозаменяемы. Например, вы можете объявить целочисленную переменную, используя одну из следующих объявлений...

http://msdn.microsoft.com/en-us/library/ya5y69ds.aspx

Редактирование: я несколько раз обманывал этот ответ, не совсем понимая правильный ответ. @BenVoight верна. Принятый список - это интегральные типы (кроме char). System.UInt16 является точно таким же типом, что и ushort, но он не является интегральным идентификатором типа (всего лишь типа структуры), как указано в грамматике.

Ответ 4

На первую часть вашего вопроса отвечают другие, но никто еще не обратился ко второй части. Кто-то, кроме OP, с тех пор редактировал второй вопрос, мой ответ больше не может применяться

UInt16 и UInt не совпадают, UInt16 представляет собой неподписанное 16-битное целое число, UInt - целое число без знака 32 бит. Они значительно различаются в своем максимальном значении.

Просто для полноты, я включаю ответ на. первый вопрос также:

The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.

Ответ 5

Для чего?

Мое предположение - соответствие CLS.