Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
Red
elnevezettColor
számtípust ,Green
ésBlue
.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 enum
kezdő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 egyintegral_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ánybalong
tartozó, de nem a tartománybaint
tartozó é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,
-2
mert az állandó értékek-1
, és-3
nem a mögöttes integráltípusuint
tartomá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
ésMax
– 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éket10
;- é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
.A
B
függ explicit módon, ésB
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.Enum
lé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:
==
,!=
,<
,>
<=
,>=
(12.12.6. §)- bináris
+
(§12.10.5) - bináris
-
(§12.10.6) ^
,&
|
( 12.13.3. §)~
(12.9.5. §)++
(--
§12.8.15 és §12.9.6)sizeof
(23.6.9. §)
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.
ECMA C# draft specification