Megosztás a következőn keresztül:


19 Enumerálás

19.1 Általános

Az enumerálási típus egy különálló értéktípus (8.3.§), amely elnevezett állandók készletét deklarálja.

Példa: A példa

enum Color
{
    Red,
    Green,
    Blue
}

deklarál egy tagokkal Redelnevezett Color számtípust , Greenés Blue.

záró példa

19.2 Enum deklarációk

Egy enum deklaráció új számtípust deklarál. Az enum deklaráció a kulcsszóval enumkezdődik, és meghatározza az enumerálás nevét, akadálymentességét, mögöttes típusát és tagjait.

enum_declaration
    : attributes? enum_modifier* 'enum' identifier enum_base? enum_body ';'?
    ;

enum_base
    : ':' integral_type
    | ':' integral_type_name
    ;

integral_type_name
    : type_name // Shall resolve to an integral type other than char
    ;

enum_body
    : '{' enum_member_declarations? '}'
    | '{' enum_member_declarations ',' '}'
    ;

Minden számtípushoz tartozik egy megfelelő integráltípus, az enum típus mögöttes típusa. Ennek az alapul szolgáló típusnak képesnek kell lennie az enumerálásban meghatározott összes számbavételi érték megjelenítésére. Ha a enum_base jelen van, explicit módon deklarálja az alapul szolgáló típust. Az alapul szolgáló típusnak a 8.3.6.char Az alapul szolgáló típust egy integral_type (8.3.5. §) vagy egy integral_type_name. A integral_type_name megoldás ugyanúgy történik, mint type_name a (7.8.1. §), beleértve az irányelveket (14.5. §) figyelembe véve.

Megjegyzés: A char típus nem használható alapul szolgáló típusként, akár kulcsszó, akár egy integral_type_name. végjegyzet

A mögöttes típust explicit módon nem deklaráló enumerációs deklaráció mögöttes típussal rendelkezik int.

Példa: A példa

enum Color : long
{
    Red,
    Green,
    Blue
}

egy enumot deklarál a mögöttes típusú long.

záró példa

Megjegyzés: A fejlesztők dönthetnek úgy, hogy a példához hasonlóan egy mögöttes típusú longértéket használnak, hogy lehetővé tegyék a tartományba long tartozó, de nem a tartományba inttartozó értékek használatát, vagy megőrizzék ezt a lehetőséget a jövőben. végjegyzet

Megjegyzés: A C# lehetővé teszi a záró vesszőt egy enum_body, ahogyan egy array_initializer lehetővé teszi (17.7.§). végjegyzet

A számbavételi deklaráció nem tartalmazhat típusparaméter-listát, de az általános osztálydeklarációba vagy általános szerkezetdeklarációba ágyazott enumerálás általános enumerációs deklaráció, mivel a szerkezetezett típus létrehozásához meg kell adni a típus argumentumait (8.4. §).

19.3 Enum módosítók

Egy enum_declaration opcionálisan tartalmazhat számmódosítók sorozatát:

enum_modifier
    : 'new'
    | 'public'
    | 'protected'
    | 'internal'
    | 'private'
    ;

Fordítási idő hibája, hogy ugyanaz a módosító többször jelenik meg egy enumerálási deklarációban.

Az enum deklaráció módosítóinak jelentése megegyezik az osztálydeklarációéval (15.2.2. §). A abstract, és sealed, módosítók static azonban nem engedélyezettek enumerálási deklarációkban. Az enumerálások nem lehetnek absztraktak, és nem teszik lehetővé a származtatást.

19.4 Enum tagok

A szám típusú deklaráció törzse nulla vagy több enum tagot határoz meg, amelyek a számtípus nevesített állandói. Két enumerálási tag nem rendelkezhet ugyanazzal a névvel.

enum_member_declarations
    : enum_member_declaration (',' enum_member_declaration)*
    ;
enum_member_declaration
    : attributes? identifier ('=' constant_expression)?
    ;

Minden enumerálási taghoz tartozik egy állandó érték. Ennek az értéknek a típusa az enumerálás alapjául szolgáló típus. Az egyes enumerálási tagok állandó értékének az enumerálás alapjául szolgáló típus tartományában kell lennie.

Példa: A példa

enum Color: uint
{
    Red = -1,
    Green = -2,
    Blue = -3
}

fordítási idő hibát eredményez, -2mert az állandó értékek -1, és -3 nem a mögöttes integráltípus uinttartományában vannak.

záró példa

Több enumerálási tag is azonos társított értékkel rendelkezhet.

Példa: A példa

enum Color
{
    Red,
    Green,
    Blue,
    Max = Blue
}

egy olyan szám, amelyben két enumerálási tag –Blue és Max– ugyanazzal a társított értékkel rendelkezik.

záró példa

Az enumerálási tag társított értéke implicit módon vagy explicit módon van hozzárendelve. Ha az enum tag deklarációja constant_expression inicializálóval rendelkezik, a szám alapjául szolgáló típussá implicit módon konvertált állandó kifejezés értéke az enum tag társított értéke. Ha az enum-tag deklarációja nem rendelkezik inicializálóval, a társított érték implicit módon van beállítva, az alábbiak szerint:

  • Ha az enumerálási tag a számtípusban deklarált első enumerálási tag, akkor a társított érték nulla.
  • Ellenkező esetben az enum tag társított értékét a rendszer úgy nyeri ki, hogy az előző enumerálási tag társított értékét eggyel növeli. Ennek a megnövelt értéknek az alapul szolgáló típus által ábrázolható értékek tartományán belül kell lennie, ellenkező esetben fordítási időhiba lép fel.

Példa: A példa

enum Color
{
    Red,
    Green = 10,
    Blue
}

class Test
{
    static void Main()
    {
        Console.WriteLine(StringFromColor(Color.Red));
        Console.WriteLine(StringFromColor(Color.Green));
        Console.WriteLine(StringFromColor(Color.Blue));
    }

    static string StringFromColor(Color c)
    {
        switch (c)
        {
            case Color.Red:
                return $"Red = {(int) c}";
            case Color.Green:
                return $"Green = {(int) c}";
            case Color.Blue:
                return $"Blue = {(int) c}";
            default:
                return "Invalid color";
      }
   }
}

kinyomtatja az enumerálási tagneveket és a hozzájuk tartozó értékeket. A kimenet a következő:

Red = 0
Green = 10
Blue = 11

a következő okokból:

  • az enum taghoz Red automatikusan hozzá lesz rendelve a nulla érték (mivel nincs inicializálója, és az első enumeráló tag);
  • az enumerálási tagnak Green explicit módon meg kell adni az értéket 10;
  • és az enumerálási taghoz Blue automatikusan hozzá lesz rendelve az az érték, amely nagyobb, mint az azt szövegesen megelőző tag.

záró példa

Az enumerálási tag társított értéke közvetlenül vagy közvetve nem használhatja saját társított enumerálási tagjának értékét. A körkörösségi korlátozáson kívül az enum tagok inicializálói a szöveges pozíciójuktól függetlenül szabadon hivatkozhatnak más enum tag inicializálókra. Az enum tagok inicializálóiban a többi enum-tag értékeit mindig a mögöttes típus típusának megfelelően kezelik, így a többi enumerálási tagra való hivatkozáshoz nincs szükség a leadásokra.

Példa: A példa

enum Circular
{
    A = B,
    B
}

fordítási időt eredményez, mert a deklarációk körkörösek A B . AB függ explicit módon, és B implicit módon függA.

záró példa

Az Enum-tagok neve és hatóköre pontosan az osztályok mezőihez hasonlóan történik. Az enumerálási tag hatóköre a számtípust tartalmazó törzs. Ezen a hatókörön belül az enumerálási tagokra egyszerű nevük hivatkozhat. Minden más kódból a számbavételi tag nevét az enum típusának nevével kell minősíteni. Az enum tagok nem rendelkeznek deklarált akadálymentességgel – a számtagok akkor érhetők el, ha a számtípusa elérhető.

19.5 A System.Enum típus

A típus System.Enum az összes számtípus absztrakt alaposztálya (ez különbözik a számtípus alapjául szolgáló típustól System.Enum ), és az örökölt tagok bármely számtípusban elérhetők. A dobozos átalakítás (10.2.9.§) bármely számtípusból System.Enumlétezik, és a dobozolás nélküli átalakítás (10.3.7.§) bármilyen számtípusra System.Enum létezik.

Ne feledje, hogy System.Enum maga nem egy enum_type. Inkább egy class_type , amelyből az összes enum_typeszármazik. A típus System.Enum a típustól System.ValueType öröklődik (8.3.2. §), amely viszont a típustól objectöröklődik. Futásidőben a típusértékek System.Enum tetszőleges számtípusú dobozos értékre vagy hivatkozásra is hivatkozhatnak null .

19.6 Enumerálási értékek és műveletek

Minden enumerálási típus külön típust határoz meg; Explicit enumerálási átalakításra (10.3.3.3. §) van szükség egy enumerálási típus és egy integráltípus, illetve két enumerálási típus közötti konvertáláshoz. Az enum típusú értékek halmaza megegyezik az alapul szolgáló típus értékeinek halmazával, és nem korlátozódik az elnevezett állandók értékeire. A szám alapjául szolgáló típus bármely értéke a szám típusára vethető, és az adott számtípus eltérő érvényes értéke.

Az enumerálási tagok enumerálási típusuk típusával rendelkeznek (kivéve a többi számtag inicializálóját: lásd a 19.4. §-t). Az enum típusúE, társított értékkel deklarált enumerálási tag értékev.(E)v

Az enum típusú értékekhez a következő operátorok használhatók:

Minden enumerálási típus automatikusan az osztályból System.Enum származik (amely viszont a System.ValueType következőből származik: és object). Így az osztály örökölt metódusai és tulajdonságai enum típusú értékeken használhatók.