(C# 參考) 列舉型別

列舉型別 (或列舉類型) 是由基礎整數數值類型的一組具名常數所定義。 若要定義列舉型別,請使用 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 參考頁面和 非獨佔成員和 API 參考頁面的 System.Enum 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# 語言規格的下列幾節:

另請參閱