WyliczeniaEnums

Typ wyliczeniowy jest odrębnym typem wartości (typy wartości), który deklaruje zestaw nazwanych stałych.An enum type is a distinct value type (Value types) that declares a set of named constants.

PrzykładThe example

enum Color
{
    Red,
    Green,
    Blue
}

deklaruje typ wyliczeniowy o nazwie Color z członkami Red, Greeni Blue.declares an enum type named Color with members Red, Green, and Blue.

Deklaracje wyliczeniaEnum declarations

Deklaracja wyliczenia deklaruje nowy typ wyliczeniowy.An enum declaration declares a new enum type. Deklaracja wyliczenia rozpoczyna się od słowa kluczowego enumi definiuje nazwę, ułatwienia dostępu, typ podstawowy i elementy członkowskie wyliczenia.An enum declaration begins with the keyword enum, and defines the name, accessibility, underlying type, and members of the enum.

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

enum_base
    : ':' integral_type
    ;

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

Każdy typ wyliczeniowy ma odpowiedni typ całkowity nazywany typem podstawowym typu wyliczeniowego.Each enum type has a corresponding integral type called the underlying type of the enum type. Ten typ podstawowy musi być w stanie reprezentować wszystkie wartości modułu wyliczającego zdefiniowane w wyliczeniu.This underlying type must be able to represent all the enumerator values defined in the enumeration. Deklaracja wyliczenia może jawnie zadeklarować typ podstawowy byte, sbyte, short, ushort, int, uint, long lub ulong.An enum declaration may explicitly declare an underlying type of byte, sbyte, short, ushort, int, uint, long or ulong. Należy zauważyć, że char nie może być używany jako typ podstawowy.Note that char cannot be used as an underlying type. Deklaracja wyliczenia, która nie deklaruje jawnie typu podstawowego, ma typ podstawowy int.An enum declaration that does not explicitly declare an underlying type has an underlying type of int.

PrzykładThe example

enum Color: long
{
    Red,
    Green,
    Blue
}

deklaruje Wyliczenie z typem podstawowym long.declares an enum with an underlying type of long. Deweloper może zdecydować się na użycie podstawowego typu long, tak jak w przykładzie, aby umożliwić użycie wartości, które znajdują się w zakresie long, ale nie w zakresie intlub aby zachować tę opcję w przyszłości.A developer might choose to use an underlying type of long, as in the example, to enable the use of values that are in the range of long but not in the range of int, or to preserve this option for the future.

Modyfikatory wyliczeniaEnum modifiers

Enum_declaration może opcjonalnie zawierać sekwencję modyfikatorów wyliczenia:An enum_declaration may optionally include a sequence of enum modifiers:

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

Jest to błąd czasu kompilacji dla tego samego modyfikatora do wyświetlenia wiele razy w deklaracji wyliczenia.It is a compile-time error for the same modifier to appear multiple times in an enum declaration.

Modyfikatory deklaracji wyliczenia mają takie samo znaczenie jak dla deklaracji klasy (Modyfikatory klas).The modifiers of an enum declaration have the same meaning as those of a class declaration (Class modifiers). Należy jednak zauważyć, że Modyfikatory abstract i sealed są niedozwolone w deklaracji wyliczenia.Note, however, that the abstract and sealed modifiers are not permitted in an enum declaration. Wyliczenia nie mogą być abstrakcyjne i nie zezwalają na wyprowadzanie.Enums cannot be abstract and do not permit derivation.

Elementy członkowskie wyliczeniaEnum members

Treść deklaracji typu wyliczeniowego definiuje zero lub więcej elementów członkowskich wyliczenia, które są nazwanymi stałymi typu wyliczeniowego.The body of an enum type declaration defines zero or more enum members, which are the named constants of the enum type. Żadne dwa elementy członkowskie wyliczenia nie mogą mieć takiej samej nazwy.No two enum members can have the same name.

enum_member_declarations
    : enum_member_declaration (',' enum_member_declaration)*
    ;

enum_member_declaration
    : attributes? identifier ('=' constant_expression)?
    ;

Każdy element członkowski wyliczenia ma skojarzoną wartość stałą.Each enum member has an associated constant value. Typ tej wartości jest typem podstawowym dla zawierającego Wyliczenie.The type of this value is the underlying type for the containing enum. Wartość stała dla każdego elementu członkowskiego wyliczenia musi znajdować się w zakresie typu podstawowego dla wyliczenia.The constant value for each enum member must be in the range of the underlying type for the enum. PrzykładThe example

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

powoduje błąd czasu kompilacji, ponieważ wartości stałe -1, -2i -3 nie należą do zakresu podstawowej uinttypu całkowitego.results in a compile-time error because the constant values -1, -2, and -3 are not in the range of the underlying integral type uint.

Wiele elementów członkowskich wyliczenia może korzystać z tej samej skojarzonej wartości.Multiple enum members may share the same associated value. PrzykładThe example

enum Color 
{
    Red,
    Green,
    Blue,

    Max = Blue
}

pokazuje Wyliczenie, w którym znajdują się dwa elementy członkowskie wyliczenia--Blue i Max--mają tę samą skojarzoną wartość.shows an enum in which two enum members -- Blue and Max -- have the same associated value.

Skojarzona wartość elementu członkowskiego wyliczenia jest przypisywana niejawnie lub jawnie.The associated value of an enum member is assigned either implicitly or explicitly. Jeśli deklaracja elementu członkowskiego wyliczenia ma inicjator constant_expression , wartość tego wyrażenia stałej, niejawnie przekonwertowana na typ podstawowy wyliczenia, jest skojarzoną wartością elementu członkowskiego wyliczenia.If the declaration of the enum member has a constant_expression initializer, the value of that constant expression, implicitly converted to the underlying type of the enum, is the associated value of the enum member. Jeśli deklaracja elementu członkowskiego wyliczenia nie ma inicjatora, jego skojarzona wartość jest ustawiana niejawnie w następujący sposób:If the declaration of the enum member has no initializer, its associated value is set implicitly, as follows:

  • Jeśli składowa wyliczenia jest pierwszym elementem członkowskim wyliczenia zadeklarowanym w typie wyliczeniowym, jego skojarzona wartość jest równa zero.If the enum member is the first enum member declared in the enum type, its associated value is zero.
  • W przeciwnym razie skojarzona wartość elementu członkowskiego wyliczenia jest uzyskiwana przez zwiększenie skojarzonej wartości składowej po raz ostatni przez jeden.Otherwise, the associated value of the enum member is obtained by increasing the associated value of the textually preceding enum member by one. Ta zwiększona wartość musi znajdować się w zakresie wartości, które mogą być reprezentowane przez typ podstawowy, w przeciwnym razie wystąpi błąd w czasie kompilacji.This increased value must be within the range of values that can be represented by the underlying type, otherwise a compile-time error occurs.

PrzykładThe example

using System;

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 String.Format("Red = {0}", (int) c);

            case Color.Green:
                return String.Format("Green = {0}", (int) c);

            case Color.Blue:
                return String.Format("Blue = {0}", (int) c);

            default:
                return "Invalid color";
        }
    }
}

drukuje nazwy elementów członkowskich wyliczenia i skojarzonych z nimi wartości.prints out the enum member names and their associated values. Dane wyjściowe:The output is:

Red = 0
Green = 10
Blue = 11

z następujących powodów:for the following reasons:

  • Red elementu członkowskiego wyliczenia jest automatycznie przypisana wartość zero (ponieważ nie ma inicjatora i jest pierwszym elementem członkowskim wyliczenia);the enum member Red is automatically assigned the value zero (since it has no initializer and is the first enum member);
  • Green elementu członkowskiego wyliczenia jawnie podano wartość 10;the enum member Green is explicitly given the value 10;
  • a Blue elementu członkowskiego wyliczenia jest automatycznie przypisywana wartość, która jest większa od elementu członkowskiego, który jest poprzedzony znakiem.and the enum member Blue is automatically assigned the value one greater than the member that textually precedes it.

Skojarzona wartość elementu członkowskiego wyliczenia może nie, bezpośrednio lub pośrednio, używać wartości własnego skojarzonego elementu członkowskiego wyliczenia.The associated value of an enum member may not, directly or indirectly, use the value of its own associated enum member. Oprócz tego ograniczenia cykliczności inicjatory składowych enum mogą swobodnie odwoływać się do innych inicjatorów składowych wyliczenia, niezależnie od ich pozycji tekstowych.Other than this circularity restriction, enum member initializers may freely refer to other enum member initializers, regardless of their textual position. W obrębie inicjatora elementu członkowskiego wyliczenia wartości innych elementów członkowskich wyliczenia są zawsze traktowane jako mają typ ich typ podstawowy, więc rzutowania nie są konieczne w przypadku odwoływania się do innych elementów członkowskich wyliczenia.Within an enum member initializer, values of other enum members are always treated as having the type of their underlying type, so that casts are not necessary when referring to other enum members.

PrzykładThe example

enum Circular
{
    A = B,
    B
}

powoduje błąd czasu kompilacji, ponieważ deklaracje A i B są cykliczne.results in a compile-time error because the declarations of A and B are circular. A zależy od B jawnie, a B zależy od niejawnego A.A depends on B explicitly, and B depends on A implicitly.

Elementy członkowskie wyliczenia są nazwane i w zakresie dokładnie analogiczne do pól w klasach.Enum members are named and scoped in a manner exactly analogous to fields within classes. Zakres elementu członkowskiego wyliczenia jest treścią zawierającego typ wyliczeniowy.The scope of an enum member is the body of its containing enum type. W tym zakresie elementy członkowskie wyliczenia mogą być określane przez ich prostą nazwę.Within that scope, enum members can be referred to by their simple name. Ze wszystkich innych kodów nazwa elementu członkowskiego wyliczenia musi być kwalifikowana nazwą jego typu wyliczeniowego.From all other code, the name of an enum member must be qualified with the name of its enum type. Elementy członkowskie wyliczenia nie mają zadeklarowanych dostępności — element członkowski wyliczenia jest dostępny, jeśli jego typ wyliczeniowy jest dostępny.Enum members do not have any declared accessibility -- an enum member is accessible if its containing enum type is accessible.

Typ System. EnumThe System.Enum type

Typ System.Enum jest abstrakcyjną klasą bazową wszystkich typów wyliczeniowych (jest to różne i inne niż typ podstawowy typu wyliczeniowego), a elementy członkowskie dziedziczone z System.Enum są dostępne w dowolnym typie wyliczeniowym.The type System.Enum is the abstract base class of all enum types (this is distinct and different from the underlying type of the enum type), and the members inherited from System.Enum are available in any enum type. Konwersja z opakowania (konwersje pakujące) istnieje z dowolnego typu wyliczeniowego do System.Enum, a konwersja rozpakowywania (konwersje rozpakowywanie) istnieje z System.Enum do dowolnego typu wyliczeniowego.A boxing conversion (Boxing conversions) exists from any enum type to System.Enum, and an unboxing conversion (Unboxing conversions) exists from System.Enum to any enum type.

Należy pamiętać, że System.Enum nie należy do enum_type.Note that System.Enum is not itself an enum_type. Nie jest to class_type , z której pochodzą wszystkie enum_types.Rather, it is a class_type from which all enum_types are derived. Typ System.Enum dziedziczy z typu System.ValueType (Typ System. ValueType), który z kolei dziedziczy po typie object.The type System.Enum inherits from the type System.ValueType (The System.ValueType type), which, in turn, inherits from type object. W czasie wykonywania, wartość typu System.Enum może być null lub odwołanie do wartości opakowanej dowolnego typu wyliczeniowego.At run-time, a value of type System.Enum can be null or a reference to a boxed value of any enum type.

Wartości wyliczeniowe i operacjeEnum values and operations

Każdy typ wyliczeniowy definiuje odrębny typ; jawna konwersja wyliczenia (jawne konwersje wyliczenia) jest wymagana do konwersji między typem wyliczenia a typem całkowitym lub między dwoma typami wyliczeniowymi.Each enum type defines a distinct type; an explicit enumeration conversion (Explicit enumeration conversions) is required to convert between an enum type and an integral type, or between two enum types. Zbiór wartości, dla których można zastosować typ wyliczeniowy, nie jest ograniczony przez elementy członkowskie wyliczenia.The set of values that an enum type can take on is not limited by its enum members. W szczególności każda wartość typu podstawowego wyliczenia może być rzutowana na typ wyliczeniowy i jest odrębną prawidłową wartością tego typu wyliczeniowego.In particular, any value of the underlying type of an enum can be cast to the enum type, and is a distinct valid value of that enum type.

Elementy członkowskie wyliczenia mają typ zawierający typ wyliczeniowy (z wyjątkiem innych inicjatorów elementów członkowskich wyliczenia: zobacz elementy członkowskie wyliczenia).Enum members have the type of their containing enum type (except within other enum member initializers: see Enum members). Wartość elementu członkowskiego wyliczenia zadeklarowana w typie wyliczeniowy E ze skojarzoną wartością v jest (E)v.The value of an enum member declared in enum type E with associated value v is (E)v.

Następujące operatory mogą być używane na wartości typów wyliczeniowych: ==, !=, <, >, <=, >= (Operatory porównania wyliczenia), binarne + (operator dodawania), Binary - (operator odejmowania), ^, &, | (Wyliczenie operatory logiczne), ~ (operatordopełnienia bitowego), ++ i -- ( Operatory przyrostka zwiększania i zmniejszania oraz Operatory przyrostu i zmniejszania prefiksu.The following operators can be used on values of enum types: ==, !=, <, >, <=, >= (Enumeration comparison operators), binary + (Addition operator), binary - (Subtraction operator), ^, &, | (Enumeration logical operators), ~ (Bitwise complement operator), ++ and -- (Postfix increment and decrement operators and Prefix increment and decrement operators).

Każdy typ wyliczeniowy jest automatycznie pochodzący z klasy System.Enum (co z kolei pochodzi od System.ValueType i object).Every enum type automatically derives from the class System.Enum (which, in turn, derives from System.ValueType and object). W ten sposób dziedziczone metody i właściwości tej klasy mogą być używane dla wartości typu wyliczeniowego.Thus, inherited methods and properties of this class can be used on values of an enum type.