Чому я не можу зарахувати UInt16?

Враховуючи код нижче:

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

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

Вона виводить System.Enum, що означає, що кишка тут не має нічого спільного з наслідуванням, і це просто вказує основний тип enum, чи правильно я?

Але якщо я зміню свій код таким чином:

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

Я отримав помилку компіляції. Чому? Чи не UInt16 та ushort те ж саме?

13
Хтось (а не ОР) редагував цю публікацію та змінив останнє запитання з "Чи не UInt16, а в тій самій?". Ви впевнені, що О.П. дійсно не означала, що вони запитували?
додано Автор Bradley Uffner, джерело
@ Брідлі Юфнер: Враховуючи, що в двох фрагментах коду використовуються ushort та System.UInt16 , видно, що ці два порівнюються.
додано Автор Ben Voigt, джерело
Не подумав би спробувати це, але цікаве спостереження тим не менш.
додано Автор Marc L., джерело
@ Брідлі Юфнер я помилився. Я планував поставити запитання: "Чи не UInt16, і не використовується ж?"
додано Автор ojlovecd, джерело
@CodeCanvas Спасибо. Я повинен був помітити, що існують схожі питання, як це було раніше.
додано Автор ojlovecd, джерело

5 Відповіді

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

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

Проте синтаксис enum не викликає типу. Натомість він вимагає одного обмеженого набору ключових слів, які контролюють основний тип. Хоча System.UInt16 є дійсним основним типом, він не є одним з ключових слів, які граматика C# дозволяє відображати у цьому місці.

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

Переклад декларації :

     
    

атрибути opt enum-modifiers opt enum identifier enum-base opt enum-body ; виберіть

  
     

Перелік балів :

     
    

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

  
     

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

     
    

sbyte

         

байт

         

short

         

ushort

         

int

         

uint

         

long

         

ulong

         

char

  
11
додано

Оскільки дійсні типи для переліку явно вказані як інтегральні типи (за винятком char ).

Затвердженими типами для переліку є байт, sbyte, короткий, ushort, int, uint, довгий або довгий.

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

Один очікує, що UInt16 буде еквівалентним ushort , що містить документацію для вбудованих типів:

Ключове слово типу C# та їх псевдоніми є взаємозамінними. Наприклад, ви можете оголосити цілу змінну, використовуючи одну з наступних декларацій ...

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

Редагувати: я зв'язався з цією відповіддю кілька разів, не зовсім схопивши правильну відповідь. @BenVoight правильно. Прийнятий список є інтегральними типами (крім char ) System.UInt16 - це точно такий самий тип, як ushort , але це не є інтегральний ідентифікатор типу (лише тип структури), як зазначено граматикою .

5
додано
Ні, це тому, що граматика не дозволяє ідентифікатору типу з'являтися там. Єдиною допустимою продукцією є інтегральний тип , вибір для яких є ключовими словами.
додано Автор Ben Voigt, джерело
Спасибі, я знав, що сам себе суперечить:/Відредаговано/дано кредит, де потрібно.
додано Автор Kevin Stricker, джерело

Це помилка компілятора CS1008 , і це дуже дає відповідь. затверджені типи для переліку:

Затверджені типи для переліку: байт, sbyte, короткий, ushort, int,   молочний, довгий або довгий.

3
додано

The first part of your question is answered by others, but no one has addressed the 2nd part yet. Someone other than the OP has since edited the 2nd question, my answer may no longer apply

UInt16 and UInt are not the same, UInt16 is an unsigned 16 bit integer, UInt is an unsigned 32 bit integer. They vary quite a bit in their maximum value.

Просто для повноти, я включаю відповідь на. Перше питання також:

Затверджені типи для переліку - байт, sbyte, короткий, ushort, int, uint, довгий або довгий.

1
додано

Що стосується чому?

Я думаю, це відповідність CLS.

1
додано
var chat = new Chat();
var chat = new Chat();
642 учасників

Обсуждение вопросов по C# / .NET / .NET Core / .NET Standard / Azure Сообщества-организаторы: — @itkpi — @dncuug