列挙型 (C# リファレンス)Enumeration types (C# reference)

" 列挙型 " は、基になる 整数値型の一連の名前付き定数によって定義された 値の型です。An enumeration type (or enum type ) is a value type defined by a set of named constants of the underlying integral numeric type. 列挙型を定義するには、enum キーワードを使用して " 列挙型メンバー " の名前を指定します。To define an enumeration type, use the enum keyword and specify the names of enum members :

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

既定では、列挙型メンバーの関連する定数値の型は int で、0 から始まり、定義テキストの順序に従って 1 ずつ増加します。By default, the associated constant values of enum members are of type int; they start with zero and increase by one following the definition text order. 他の任意の整数値型を、列挙型の基になる型として明示的に指定できます。You can explicitly specify any other integral numeric type as an underlying type of an enumeration type. また、次の例に示すように、関連する定数値を明示的に指定することもできます。You can also explicitly specify the associated constant values, as the following example shows:

enum ErrorCode : ushort
{
    None = 0,
    Unknown = 1,
    ConnectionLost = 100,
    OutlierReading = 200
}

列挙型の定義内でメソッドを定義することはできません。You cannot define a method inside the definition of an enumeration type. 列挙型に機能を追加するには、拡張メソッドを作成します。To add functionality to an enumeration type, create an extension method.

列挙型 E の既定値は、式 (E)0 によって生成される値です。この値は、ゼロに対応する列挙メンバーがなくても生成されます。The default value of an enumeration type E is the value produced by expression (E)0, even if zero doesn't have the corresponding enum member.

列挙型を使用して、相互に排他的な一連の値の選択肢、または選択肢の組み合わせを表します。You use an enumeration type to represent a choice from a set of mutually exclusive values or a combination of choices. 選択肢の組み合わせを表すには、列挙型をビット フラグとして定義します。To represent a combination of choices, define an enumeration type as bit flags.

ビット フラグとしての列挙型Enumeration types as bit flags

列挙型で選択肢の組み合わせを表したいときは、個々の選択肢がビット フィールドになるように、列挙型メンバーをそれらの選択肢に対して定義します。If you want an enumeration type to represent a combination of choices, define enum members for those choices such that an individual choice is a bit field. つまり、これらの列挙型メンバーの関連する値は、2 の累乗である必要があります。That is, the associated values of those enum members should be the powers of two. 次に、ビットごとの論理演算子 | または & を使用し、選択肢を組み合わせたり、選択肢の組み合わせを交差させたりすることができます。Then, you can use the bitwise logical operators | or & to combine choices or intersect combinations of choices, respectively. 列挙型によってビット フィールドが宣言されていることを示すには、フラグ属性を適用します。To indicate that an enumeration type declares bit fields, apply the Flags attribute to it. 次の例に示すように、列挙型の定義に一般的な組み合わせをいくつか含めることもできます。As the following example shows, you can also include some typical combinations in the definition of an enumeration type.

[Flags]
public enum Days
{
    None      = 0b_0000_0000,  // 0
    Monday    = 0b_0000_0001,  // 1
    Tuesday   = 0b_0000_0010,  // 2
    Wednesday = 0b_0000_0100,  // 4
    Thursday  = 0b_0000_1000,  // 8
    Friday    = 0b_0001_0000,  // 16
    Saturday  = 0b_0010_0000,  // 32
    Sunday    = 0b_0100_0000,  // 64
    Weekend   = Saturday | Sunday
}

public class FlagsEnumExample
{
    public static void Main()
    {
        Days meetingDays = Days.Monday | Days.Wednesday | Days.Friday;
        Console.WriteLine(meetingDays);
        // Output:
        // Monday, Wednesday, Friday

        Days workingFromHomeDays = Days.Thursday | Days.Friday;
        Console.WriteLine($"Join a meeting by phone on {meetingDays & workingFromHomeDays}");
        // Output:
        // Join a meeting by phone on Friday

        bool isMeetingOnTuesday = (meetingDays & Days.Tuesday) == Days.Tuesday;
        Console.WriteLine($"Is there a meeting on Tuesday: {isMeetingOnTuesday}");
        // Output:
        // Is there a meeting on Tuesday: False

        var a = (Days)37;
        Console.WriteLine(a);
        // Output:
        // Monday, Wednesday, Saturday
    }
}

詳細と例については、System.FlagsAttribute API リファレンス ページ、および System.Enum API リファレンス ページの「非排他的メンバーと Flags 属性」セクションを参照してください。For more information and examples, see the System.FlagsAttribute API reference page and the Non-exclusive members and the Flags attribute section of the System.Enum API reference page.

System.Enum 型と列挙型定数The System.Enum type and enum constraint

System.Enum 型は、すべての列挙型の抽象基底クラスです。The System.Enum type is the abstract base class of all enumeration types. この型には、列挙型とその値に関する情報を取得するためのメソッドがいくつか用意されています。It provides a number of methods to get information about an enumeration type and its values. 詳細と例については、System.Enum API リファレンス ページを参照してください。For more information and examples, see the System.Enum API reference page.

C# 7.3 以降、基底クラス制約 (列挙の制約と呼ばれます) で System.Enum を使用して、型パラメーターが列挙型であることを指定できます。Beginning with C# 7.3, you can use System.Enum in a base class constraint (that is known as the enum constraint) to specify that a type parameter is an enumeration type.

変換Conversions

列挙型については、列挙型とその基になる整数型との間に明示的な変換が存在します。For any enumeration type, there exist explicit conversions between the enumeration type and its underlying integral type. 列挙値をその基になる型にキャストすると、結果は列挙メンバーの関連する整数値になります。If you cast an enum value to its underlying type, the result is the associated integral value of an enum member.

public enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

public class EnumConversionExample
{
    public static void Main()
    {
        Season a = Season.Autumn;
        Console.WriteLine($"Integral value of {a} is {(int)a}");  // output: Integral value of Autumn is 2

        var b = (Season)1;
        Console.WriteLine(b);  // output: Summer

        var c = (Season)4;
        Console.WriteLine(c);  // output: 4
    }
}

Enum.IsDefined メソッドを使用して、列挙型に、関連する特定の値を持つ列挙型メンバーが含まれているかどうかを確認します。Use the Enum.IsDefined method to determine whether an enumeration type contains an enum member with the certain associated value.

列挙型については、System.Enum 型との間にボックス化とボックス化解除変換が存在します。For any enumeration type, there exist boxing and unboxing conversions to and from the System.Enum type, respectively.

C# 言語仕様C# language specification

詳細については、「C# 言語仕様」の次のセクションを参照してください。For more information, see the following sections of the C# language specification:

関連項目See also