enum (C# リファレンス)enum (C# Reference)

enum キーワードは、列挙型を宣言するために使用されます。列挙型は、列挙子リストと呼ばれる名前付き定数の集まりで構成される固有の型です。The enum keyword is used to declare an enumeration, a distinct type that consists of a set of named constants called the enumerator list.

通常、列挙型は名前空間内に直接定義して、名前空間内のすべてのクラスが共通の利便性でアクセスできるようにするのが最も適切です。Usually it is best to define an enum directly within a namespace so that all classes in the namespace can access it with equal convenience. ただし、列挙型はクラスまたは構造体内に入れ子にすることもできます。However, an enum can also be nested within a class or struct.

既定では、最初の列挙子の値は 0 で、後続の列挙子の値は 1 ずつ増加していきます。By default, the first enumerator has the value 0, and the value of each successive enumerator is increased by 1. たとえば、次の列挙型では、 Sat0Sun1Mon2などとなります。For example, in the following enumeration, Sat is 0, Sun is 1, Mon is 2, and so forth.

enum Day {Sat, Sun, Mon, Tue, Wed, Thu, Fri};

列挙型では、次の例に示すように、初期化子を使用して既定値をオーバーライドできます。Enumerators can use initializers to override the default values, as shown in the following example.

enum Day {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

この列挙型では、要素の並びは 1 からではなく、 0から開始します。In this enumeration, the sequence of elements is forced to start from 1 instead of 0. ただし、列挙型には値が 0 となる定数を含めておくことをお勧めします。However, including a constant that has the value of 0 is recommended. 詳細については、列挙型を参照してください。For more information, see Enumeration Types.

すべての列挙型には基になる型があり、基になる型には char 以外の任意の整数型を指定できます。Every enumeration type has an underlying type, which can be any integral type except char. 列挙要素の基になる既定の型は intです。byteなど、他の整数型の列挙型を宣言するには、次の例に示すように、識別子に続けてコロンを使用し、その後に型を記述します。The default underlying type of enumeration elements is int. To declare an enum of another integral type, such as byte, use a colon after the identifier followed by the type, as shown in the following example.

enum Day : byte {Sat=1, Sun, Mon, Tue, Wed, Thu, Fri};

列挙型で許容される型は、bytesbyteshortushortintuintlong、または ulong です。The approved types for an enum are byte, sbyte, short, ushort, int, uint, long, or ulong.

Day の変数には、基になる型の範囲内の任意の値を割り当てることができます。値は名前付き定数に限定されません。A variable of type Day can be assigned any value in the range of the underlying type; the values are not limited to the named constants.

enum E の既定値は、式 (E)0によって算出された値です。The default value of an enum E is the value produced by the expression (E)0.

注意

列挙子の名前に空白を使用することはできません。An enumerator cannot contain white space in its name.

基になる型は、列挙子ごとに割り当てるストレージの大きさを指定します。The underlying type specifies how much storage is allocated for each enumerator. ただし、 enum 型を整数型に変換するには、明示的なキャストが必要です。However, an explicit cast is necessary to convert from enum type to an integral type. たとえば、次のステートメントでは enum 型から int 型へのキャストを使用することで、列挙子 Sunint 型の変数に代入します。For example, the following statement assigns the enumerator Sun to a variable of the type int by using a cast to convert from enum to int.

int x = (int)Day.Sun;

ビット単位の OR 演算と組み合わせることができる要素を含む列挙型に System.FlagsAttribute を適用すると、一部のツールを使用したときに、 enum の動作に属性が反映されます。When you apply System.FlagsAttribute to an enumeration that contains elements that can be combined with a bitwise OR operation, the attribute affects the behavior of the enum when it is used with some tools. このような変更は、 Console クラス メソッドや式エバリュエーターなどのツールを使用して確認できます。You can notice these changes when you use tools such as the Console class methods and the Expression Evaluator. (3 番目の使用例をご参照ください。)(See the third example.)

信頼性の高いプログラミングRobust programming

定数の場合と同様に、列挙型の個々の値へのすべての参照はコンパイル時に数値リテラルに変換されます。Just as with any constant, all references to the individual values of an enum are converted to numeric literals at compile time. これにより、「定数」で説明しているように、バージョン管理の問題が発生する可能性があります。This can create potential versioning issues as described in Constants.

新しいバージョンの列挙型に追加の値を割り当てるか、新しいバージョンの列挙型メンバーの値を変更すると、依存関係のあるソース コードに問題が発生することがあります。Assigning additional values to new versions of enums, or changing the values of the enum members in a new version, can cause problems for dependent source code. 列挙値は、 switch ステートメントでよく使用されます。Enum values often are used in switch statements. enum 型に追加要素が追加されている場合、switch ステートメントの default セクションが予期せずに選択される場合があります。If additional elements have been added to the enum type, the default section of the switch statement can be selected unexpectedly.

作成したコードが他の開発者によって使用される場合は、新しい要素を enum 型に追加したときのコードの反応を規定するガイドラインを用意しておく必要があります。If other developers use your code, you should provide guidelines about how their code should react if new elements are added to any enum types.

Example

次の例では、列挙型 Dayを宣言しています。In the following example, an enumeration, Day, is declared. 2 つの列挙子は明示的に整数に変換され、整数変数に代入されます。Two enumerators are explicitly converted to integer and assigned to integer variables.


public class EnumTest
{
    enum Day { Sun, Mon, Tue, Wed, Thu, Fri, Sat };

    static void Main()
    {
        int x = (int)Day.Sun;
        int y = (int)Day.Fri;
        Console.WriteLine("Sun = {0}", x);
        Console.WriteLine("Fri = {0}", y);
    }
}
/* Output:
   Sun = 0
   Fri = 5
*/

Example

次の例では、基本型オプションを使用して enum 型をメンバーに持つ longを宣言しています。In the following example, the base-type option is used to declare an enum whose members are of type long. 列挙型の基になる型が longであっても、列挙型メンバーはキャストを使用して long 型に明示的に変換する必要があることにご注意ください。Notice that even though the underlying type of the enumeration is long, the enumeration members still must be explicitly converted to type long by using a cast.

public class EnumTest2
{
    enum Range : long { Max = 2147483648L, Min = 255L };
    static void Main()
    {
        long x = (long)Range.Max;
        long y = (long)Range.Min;
        Console.WriteLine("Max = {0}", x);
        Console.WriteLine("Min = {0}", y);
    }
}
/* Output:
   Max = 2147483648
   Min = 255
*/

Example

次のコード例では、 System.FlagsAttribute 宣言での enum 属性の使用とその効果を示します。The following code example illustrates the use and effect of the System.FlagsAttribute attribute on an enum declaration.

// Add the attribute Flags or FlagsAttribute.
[Flags]
public enum CarOptions
{
    // The flag for SunRoof is 0001.
    SunRoof = 0x01,
    // The flag for Spoiler is 0010.
    Spoiler = 0x02,
    // The flag for FogLights is 0100.
    FogLights = 0x04,
    // The flag for TintedWindows is 1000.
    TintedWindows = 0x08,
}

class FlagTest
{
    static void Main()
    {
        // The bitwise OR of 0001 and 0100 is 0101.
        CarOptions options = CarOptions.SunRoof | CarOptions.FogLights;

        // Because the Flags attribute is specified, Console.WriteLine displays
        // the name of each enum element that corresponds to a flag that has
        // the value 1 in variable options.
        Console.WriteLine(options);
        // The integer value of 0101 is 5.
        Console.WriteLine((int)options);
    }
}
/* Output:
   SunRoof, FogLights
   5
*/

コメントComments

この例では、 Flagsを削除すると次の値が表示されます。If you remove Flags, the example displays the following values:

5

5

C# 言語仕様C# language specification

詳細については、「C# 言語の仕様」を参照してください。For more information, see the C# Language Specification. 言語仕様は、C# の構文と使用法に関する信頼性のある情報源です。The language specification is the definitive source for C# syntax and usage.

関連項目See also

C# リファレンスC# Reference
列挙型Enumeration Types
C# のキーワードC# Keywords
整数型の一覧表Integral Types Table
組み込み型の一覧表Built-In Types Table
暗黙的な数値変換の一覧表Implicit Numeric Conversions Table
明示的な数値変換の一覧表Explicit Numeric Conversions Table
列挙型の名前付け規則Enum Naming Conventions