列挙体Enums

列挙型は、名前付き定数のセットを宣言する個別の値型 (値型) です。An enum type is a distinct value type (Value types) that declares a set of named constants.

The example

enum Color
{
    Red,
    Green,
    Blue
}

RedGreen、および Blueのメンバーを持つ Color という名前の列挙型を宣言します。declares an enum type named Color with members Red, Green, and Blue.

列挙型の宣言Enum declarations

列挙型宣言は、新しい列挙型を宣言します。An enum declaration declares a new enum type. 列挙型宣言は、キーワード enumで始まり、名前、アクセシビリティ、基になる型、および列挙型のメンバーを定義します。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 ',' '}'
    ;

各列挙型には、列挙型の基になる型と呼ばれる対応する整数型があります。Each enum type has a corresponding integral type called the underlying type of the enum type. この基になる型は、列挙体で定義されているすべての列挙子の値を表すことができる必要があります。This underlying type must be able to represent all the enumerator values defined in the enumeration. 列挙型宣言は、bytesbyteshortushortintuintlongulongの基になる型を明示的に宣言できます。An enum declaration may explicitly declare an underlying type of byte, sbyte, short, ushort, int, uint, long or ulong. char は、基になる型として使用できないことに注意してください。Note that char cannot be used as an underlying type. 基になる型を明示的に宣言しない列挙型宣言には、intの基になる型があります。An enum declaration that does not explicitly declare an underlying type has an underlying type of int.

The example

enum Color: long
{
    Red,
    Green,
    Blue
}

基になる型が longの列挙型を宣言します。declares an enum with an underlying type of long. 開発者は、例に示すように、基になる型の longを使用して、long の範囲内の値の使用を有効にしたり、intの範囲外にしたり、今後このオプションを保持したりすることができます。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.

列挙修飾子Enum modifiers

Enum_declarationには、必要に応じて列挙修飾子のシーケンスを含めることができます。An enum_declaration may optionally include a sequence of enum modifiers:

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

同じ修飾子が列挙型宣言で複数回出現する場合、コンパイル時エラーになります。It is a compile-time error for the same modifier to appear multiple times in an enum declaration.

列挙型宣言の修飾子は、クラス宣言 (クラス修飾子) と同じ意味を持ちます。The modifiers of an enum declaration have the same meaning as those of a class declaration (Class modifiers). ただし、enum 宣言では、abstract 修飾子と sealed 修飾子は使用できません。Note, however, that the abstract and sealed modifiers are not permitted in an enum declaration. 列挙型を抽象にすることはできません。また、派生を許可しません。Enums cannot be abstract and do not permit derivation.

列挙型メンバーEnum members

列挙型宣言の本体では、列挙型の名前付き定数である0個以上の列挙型メンバーを定義します。The body of an enum type declaration defines zero or more enum members, which are the named constants of the enum type. 2つの列挙メンバーが同じ名前を持つことはできません。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)?
    ;

各列挙型メンバーには、定数値が関連付けられています。Each enum member has an associated constant value. この値の型は、それを含む列挙型の基になる型です。The type of this value is the underlying type for the containing enum. 各列挙型メンバーの定数値は、列挙型の基になる型の範囲内である必要があります。The constant value for each enum member must be in the range of the underlying type for the enum. The example

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

-1-2、および -3 定数値が基になる整数型 uintの範囲内にないため、コンパイル時エラーが発生します。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.

複数の列挙メンバーが同じ関連する値を共有する場合があります。Multiple enum members may share the same associated value. The example

enum Color 
{
    Red,
    Green,
    Blue,

    Max = Blue
}

2つの列挙メンバー--BlueMax に同じ値が関連付けられている列挙体を示します。shows an enum in which two enum members -- Blue and Max -- have the same associated value.

列挙メンバーの関連する値は、暗黙的または明示的に割り当てられます。The associated value of an enum member is assigned either implicitly or explicitly. 列挙型メンバーの宣言にconstant_expression初期化子がある場合、その定数式の値は列挙型の基になる型に暗黙的に変換され、列挙型メンバーの値になります。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. 列挙型メンバーの宣言に初期化子がない場合、次のように、そのメンバーに関連付けられている値が暗黙的に設定されます。If the declaration of the enum member has no initializer, its associated value is set implicitly, as follows:

  • 列挙型のメンバーが列挙型で宣言された最初の列挙型のメンバーである場合、それに関連付けられた値は0になります。If the enum member is the first enum member declared in the enum type, its associated value is zero.
  • それ以外の場合、列挙型メンバーの関連する値を取得するには、直前の列挙型メンバーの関連する値を1つ増やします。Otherwise, the associated value of the enum member is obtained by increasing the associated value of the textually preceding enum member by one. この増加した値は、基になる型で表すことができる値の範囲内である必要があります。それ以外の場合は、コンパイル時にエラーが発生します。This increased value must be within the range of values that can be represented by the underlying type, otherwise a compile-time error occurs.

The 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";
        }
    }
}

列挙メンバー名とそれに関連付けられている値を出力します。prints out the enum member names and their associated values. 出力は次のようになります。The output is:

Red = 0
Green = 10
Blue = 11

次の理由が考えられます。for the following reasons:

  • 列挙型メンバー Red には、初期化子がなく、最初の列挙メンバーであるため、値0が自動的に割り当てられます。the enum member Red is automatically assigned the value zero (since it has no initializer and is the first enum member);
  • 列挙型のメンバー Green には、明示的に値 10が指定されます。the enum member Green is explicitly given the value 10;
  • 列挙型メンバー Blue には、その前にあるメンバーよりも大きい値が自動的に割り当てられます。and the enum member Blue is automatically assigned the value one greater than the member that textually precedes it.

列挙型メンバーに関連付けられた値は、それ自体に関連付けられている列挙型メンバーの値を直接または間接的に使用することはできません。The associated value of an enum member may not, directly or indirectly, use the value of its own associated enum member. この循環制限以外に、列挙型メンバー初期化子は、テキストの位置に関係なく、他の列挙型メンバーの初期化子を自由に参照できます。Other than this circularity restriction, enum member initializers may freely refer to other enum member initializers, regardless of their textual position. 列挙メンバー初期化子内では、他の列挙型メンバーの値は、他の列挙型のメンバーを参照するときにキャストが不要になるように、その基になる型の型として常に処理されます。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.

The example

enum Circular
{
    A = B,
    B
}

AB の宣言が循環しているため、コンパイル時エラーが発生します。results in a compile-time error because the declarations of A and B are circular. AB に明示的に依存し、B は暗黙的に A に依存します。A depends on B explicitly, and B depends on A implicitly.

列挙型メンバーには、クラス内のフィールドに厳密に似た方法で名前が付けられます。Enum members are named and scoped in a manner exactly analogous to fields within classes. 列挙型メンバーのスコープは、それを含んでいる列挙型の本体です。The scope of an enum member is the body of its containing enum type. そのスコープ内では、列挙型のメンバーを単純な名前で参照できます。Within that scope, enum members can be referred to by their simple name. 他のすべてのコードからは、列挙型メンバーの名前が列挙型の名前で修飾されている必要があります。From all other code, the name of an enum member must be qualified with the name of its enum type. 列挙型メンバーは、宣言されたアクセシビリティを持っていません。列挙型メンバーには、その列挙型がアクセス可能な場合にアクセスできます。Enum members do not have any declared accessibility -- an enum member is accessible if its containing enum type is accessible.

System.enum 型The System.Enum type

System.Enum 型は、すべての列挙型の抽象基本クラス (これは列挙型の基になる型とは異なります) であり、System.Enum から継承されたメンバーは任意の列挙型で使用できます。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. 任意の列挙型から System.Enumへのボックス変換 (ボックス化変換) が存在し、System.Enum から任意の列挙型へのアンボックス変換 (ボックス化変換) が存在します。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.

System.Enum は、それ自体がenum_typeではないことに注意してください。Note that System.Enum is not itself an enum_type. これは、すべてのenum_typeの派生元であるclass_typeです。Rather, it is a class_type from which all enum_types are derived. System.Enum System.ValueType (system.string) から継承されます。この型は object型から継承されます。The type System.Enum inherits from the type System.ValueType (The System.ValueType type), which, in turn, inherits from type object. 実行時には、System.Enum 型の値を null するか、任意の列挙型のボックス化された値への参照を指定できます。At run-time, a value of type System.Enum can be null or a reference to a boxed value of any enum type.

列挙値と操作Enum values and operations

それぞれの列挙型は、個別の型を定義します。列挙型と整数型の間、または2つの列挙型間で変換を行うには、明示的な列挙変換 (明示的な列挙変換) が必要です。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. 列挙型が受け取ることができる値のセットは、列挙型のメンバーによって制限されません。The set of values that an enum type can take on is not limited by its enum members. 特に、列挙型の基になる型の任意の値を列挙型にキャストできます。これは、その列挙型の個別の有効な値です。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.

列挙型メンバーには、それを含む列挙型の型があります (他の列挙型メンバーの初期化子内を除きます)。列挙型メンバーを参照してください。Enum members have the type of their containing enum type (except within other enum member initializers: see Enum members). Enum 型で宣言された列挙型メンバーの値が、関連付けられている値 v E (E)vです。The value of an enum member declared in enum type E with associated value v is (E)v.

列挙型の値には、次の演算子を使用できます。 ==!=<><=>= (列挙比較演算子)、バイナリ + (加算演算子)、バイナリ - (減算演算子)、^&| (列挙論理演算子)、~ (ビットごとの補数演算子)、++ -- (後置インクリメント演算子と前置デクリメント演算子前置インクリメント演算子と前置デクリメント演算子)。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).

すべての列挙型は、クラス System.Enum (つまり、System.ValueTypeobjectから派生します) から自動的に派生します。Every enum type automatically derives from the class System.Enum (which, in turn, derives from System.ValueType and object). したがって、このクラスの継承されたメソッドとプロパティは、列挙型の値に対して使用できます。Thus, inherited methods and properties of this class can be used on values of an enum type.