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

"列挙型" は、基になる整数値型の一連の名前付き定数によって定義された値の型です。 列挙型を定義するには、enum キーワードを使用して "列挙型メンバー" の名前を指定します。

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

既定では、列挙型メンバーの関連する定数値の型は int で、0 から始まり、定義テキストの順序に従って 1 ずつ増加します。 他の任意の整数値型を、列挙型の基になる型として明示的に指定できます。 また、次の例に示すように、関連する定数値を明示的に指定することもできます。

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

列挙型の定義内でメソッドを定義することはできません。 列挙型に機能を追加するには、拡張メソッドを作成します。

列挙型 E の既定値は、式 (E)0 によって生成される値です。この値は、ゼロに対応する列挙メンバーがなくても生成されます。

列挙型を使用して、相互に排他的な一連の値の選択肢、または選択肢の組み合わせを表します。 選択肢の組み合わせを表すには、列挙型をビット フラグとして定義します。

ビット フラグとしての列挙型

列挙型で選択肢の組み合わせを表したいときは、個々の選択肢がビット フィールドになるように、列挙型メンバーをそれらの選択肢に対して定義します。 つまり、これらの列挙型メンバーの関連する値は、2 の累乗である必要があります。 次に、ビットごとの論理演算子 | または & を使用し、選択肢を組み合わせたり、選択肢の組み合わせを交差させたりすることができます。 列挙型によってビット フィールドが宣言されていることを示すには、フラグ属性を適用します。 次の例に示すように、列挙型の定義に一般的な組み合わせをいくつか含めることもできます。

[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 属性」セクションを参照してください。

System.Enum 型と列挙型定数

System.Enum 型は、すべての列挙型の抽象基底クラスです。 この型には、列挙型とその値に関する情報を取得するためのメソッドがいくつか用意されています。 詳細と例については、System.Enum API リファレンス ページを参照してください。

基底クラス制約 (列挙の制約と呼ばれます) で System.Enum を使用して、型パラメーターが列挙型であることを指定できます。 また、任意の列挙型も struct 制約を満たしています。これは、型パラメーターが null 非許容値型であることを指定するために使用されます。

変換

列挙型については、列挙型とその基になる整数型との間に明示的な変換が存在します。 列挙値をその基になる型にキャストすると、結果は列挙メンバーの関連する整数値になります。

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 メソッドを使用して、列挙型に、関連する特定の値を持つ列挙型メンバーが含まれているかどうかを確認します。

列挙型については、System.Enum 型との間にボックス化とボックス化解除変換が存在します。

C# 言語仕様

詳細については、「C# 言語仕様」の次のセクションを参照してください。

関連項目