Чаму я не магу засноўваць пералік выключыць 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 тое ж самае?

13
Хтосьці (не ОП) рэдагаваў гэты пост і змяніў апошняе пытанне ад «А ці не UInt16 і ИНТ тое ж самае?». вы ўпэўненыя, што OP сапраўды не азначае, што яны прасілі?
дададзена аўтар Bradley Uffner, крыніца
@BradleyUffner: Улічваючы, што два фрагменты кода выкарыстоўваецца USHORT і System.UInt16 , гэта ясна, гэта тыя два параўноўваных.
дададзена аўтар Ben Voigt, крыніца
не думалі б паспрабаваць гэта, але тым не менш цікавае назіранне.
дададзена аўтар Marc L., крыніца
@BradleyUffner я зрабіў памылку. Я планаваў спытаць "не UInt16 і UShort тое ж самае?»
дададзена аўтар ojlovecd, крыніца
@CodeCanvas Дзякуй. Я павінен быў заўважыць, што ёсць пытанні, аналагічныя з ёй задавалася.
дададзена аўтар ojlovecd, крыніца

5 адказы

Вы маеце рацыю, што адлюстраванне не паведамляе пра тое, што пералік спадчыну базавы тып, які спецыфікацыя называе «базавы тып». Вы можаце знайсці яго з дапамогай Enum.GetUnderlyingType замест гэтага.

Тып названы USHORT і System.UInt16 у дакладнасці тое ж самае.

Аднак, сінтаксіс пералік не патрабуе тыпу. Замест гэтага ён заклікае да аднаго з абмежаванага набору ключавых слоў, якія кантралююць базавы тып. У той час як System.UInt16 сапраўдны базавы тып, гэта не адзін з ключавых слоў, якое дазваляе # граматыцы C, каб з'явіцца ў гэтым месцы.

Цытаванне граматычнага :

перечислимый дэкларацыя

     
    

атрыбуты <суб> неаўтаматычныя пералічэнняў-мадыфікатары <суб> неаўтаматычныя <моцны> пералік ідэнтыфікатар пералік базы <суб> неаўтаматычныя пералік цела <моцны> ; <суб> неаўтаматычныя

  
     

пералік базы

     
    

<моцны> : Інтэграл тыпу

  
     

Інтэграл тыпу

     
    

<моцны> SByte

         <Р> <моцны> байт          

<моцны> кароткі

         

<моцны> USHORT

         

<моцны> Int

         

<моцны> UINT

         

<моцны> доўгі

         

<моцны> ULONG

         

<моцны> сімвал

  
11
дададзена

Паколькі дапушчальныя тыпы для пералічэння відавочна паказана, што інтэгральныя тыпы (за выключэннем сімвал ).

<Р> Зацверджаныя тыпаў для пералічэння з'яўляюцца байтамі, SByte, кароткі, USHORT, INT, UINT, доўгім або ULONG.

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

Адзін будзе чакаць будзе эквівалентна USHORT дадзенай дакументацыі для ўбудаваных тыпаў:

C# тып ключавых слоў і іх псеўданімы з'яўляюцца ўзаемазаменнымі. Напрыклад, вы можаце абвясціць цэлалікавых зменную з дапамогай аднаго з наступных аб'яваў ...

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

Edit: я важдаўся з гэтым адказам некалькі разоў не зусім схапіўшы правільны адказ. @BenVoight правільна. Прынятая спіс з'яўляюцца неад'емнымі тыпаў (акрамя сімвал ) System.UInt16 гэта сапраўды такога ж тыпу, як UShort , але гэта не з'яўляецца ідэнтыфікатар інтэгральнага тыпу (толькі тып структуры), як паказана граматык .

5
дададзена
Не, гэта таму, што граматыка не дазваляе ідэнтыфікатар тыпу з'яўляцца там. Дапускаецца толькі вытворчасць <я> Інтэграл тыпу , выбары, для якіх ключавыя словы.
дададзена аўтар Ben Voigt, крыніца
Дзякуй, я ведаў, што я пярэчу сабе там:/Edited/крэдыт даецца дзе з-за.
дададзена аўтар Kevin Stricker, крыніца

Гэта кампілятар памылка CS1008 , і у значнай ступені дае адказ. зацверджаных тыпаў для пералічэння:

<Р> Зацверджаныя тыпаў для пералічэння з'яўляюцца байты, SByte, кароткі, USHORT, INT,   UINT, доўгія або ULONG.

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, доўгім або ULONG.

1
дададзена

А чаму?

Мая здагадка з'яўляецца захаванне CLS.

1
дададзена