Неліктен мен 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 емес және int бірдей емес пе?» Деп өзгертті. ОС-ны олар сұраған нәрселерді шынымен білдірмегеніне сенімдісіз бе?
қосылды автор Bradley Uffner, көзі
@BradleyUffner: Екі кодтың үзінділері ushort және System.UInt16 қолданылғанын ескере отырып, олар екі салыстырылады.
қосылды автор Ben Voigt, көзі
Мұны істей алмас едік, бірақ қызықты байқау.
қосылды автор Marc L., көзі
@BradleyUffner Мен қателік жасадым. Мен «UInt16 емес пе және сол сияқты» деп сұрамақшы болдым.
қосылды автор ojlovecd, көзі
@CodeCanvas рахмет. Мен бұрын сұраған ұқсас сұрақтар бар екенін байқаған болар едім.
қосылды автор ojlovecd, көзі

5 жауаптар

Шағылысымның негізгі түрін иемденгені туралы мәлімдеме жасалмайды, ол ерекшеліктің «негізгі түрін» деп атайды. Сіз оны Enum.GetUnderlyingType орнына.

ushort және System.UInt16 деп аталатын түрі дәл бірдей.

Алайда, enum синтаксисі түрге қоңырау шалмайды. Оның орнына ол негізгі түрін басқаратын кілт сөздердің шектелген жиынтығының бірін шақырады. Бірақ System.UInt16 - жарамды негіздік түрі болса, бұл C# грамматикасының сол жерде пайда болуына рұқсат беретін негізгі сөздердің бірі емес.

грамматиканы аудару:

enum-declaration :

     
    

атрибуттар opt enum-modifiers opt enum ; идентификатор enum-base opt /strong> опциясын таңдаңыз

  
     

enum-base :

     
    

: интегралдық тип

  
     

интегралы-тип :

     
    

sbyte

         

байт

         

қысқа

         

ushort

         

int

         

uint

         

ұзын

         

Ұялы

         

char

  
11
қосылды

Себептерге арналған жарамды түрлер интегралды түрлер ретінде анықталғандықтан ( char басқа).

Enum үшін бекітілген түрлер байт, 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
қосылды
Жоқ, өйткені грамматика түр идентификаторының пайда болуына жол бермейді. Жалғыз рұқсат етілген өндіріс integral-type болып табылады, оның шешімдері кілт сөздер болып табылады.
қосылды автор Ben Voigt, көзі
Рахмет, мен онда өзіме қайшы келетіндігін білдім:
қосылды автор Kevin Stricker, көзі

Бұл компилятор қатесі CS1008 және ол жауапты жеткілікті түрде қамтамасыз етеді. Enum үшін мақұлданған түрлері .

Enum үшін бекітілген түрлер байт, sbyte, қысқа, ushort, int,   uint, long немесе 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.

Толық болу үшін мен жауапты қосып отырмын. Бірінші мәселе:

Enum үшін бекітілген түрлер байт, sbyte, қысқа, ushort, int, uint, ұзын немесе үлкен.

1
қосылды

Неліктен?

Менің ойымша CLS талаптарына сәйкестік.

1
қосылды