列舉類型 (C# 參考)

「列舉類型」 (enumeration type) 是由基礎整數數值類型的一組具名常數所定義的實值型別。 若要定義列舉類型,請使用 enum 關鍵字並指定「列舉成員」的名稱:

enum Season
{
    Spring,
    Summer,
    Autumn,
    Winter
}

根據預設,列舉成員的相關聯常數值屬於 int 類型,其從零開始,並依定義文字順序加一。 您可以將其他任何整數數值類型明確地指定為列舉類型的基礎類型。 您也可以明確地指定相關聯的常數值,如下列範例所示:

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

您無法在列舉類型定義內定義方法。 若要將功能新增至列舉類型,請建立擴充方法

列舉類型 E 的預設值是運算式 (E)0 所產生的值,即使零沒有對應的列舉成員也一樣。

您可以使用列舉類型來表示一組互斥值選擇或選擇的組合。 若要表示選擇的組合,請將列舉類型定義為位元旗標。

作為位元旗標的列舉類型

如果您希望列舉類型代表選擇的組合,請定義那些選擇的列舉成員,讓個別選擇是位元欄位。 也就是說,那些列舉成員的關聯值應該是二的次方。 接著,您可以使用位元邏輯運算子 |& 分別合併選擇或建立選擇組合的交集。 若要指示列舉類型宣告位元欄位,請在其中套用 Flags 屬性。 如下列範例所示,您也可以在列舉類型定義中包含一些典型的組合。

[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 類型之間的 boxing 和 unboxing 轉換。

C# 語言規格

如需詳細資訊,請參閱 C# 語言規格的下列幾節:

另請參閱