列舉類型 (c # 參考)

列舉型別 (或列舉型別) 是一組由基礎整數數值型別之指定常數所定義的實值型別。 若要定義列舉型別,請使用 enum 關鍵字並指定 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
    }
}

如需詳細資訊和範例,請參閱 [api 參考] 頁面的 [ System.FlagsAttribute api 參考] 頁面和 [ System.FlagsAttribute ] 區段 System.Enum

System.string 型別和列舉條件約束

System.Enum 類型是所有列舉類型的抽象基類。 它會提供數種方法來取得列舉型別和其值的相關資訊。 如需詳細資訊和範例,請參閱 System.Enum API 參考頁面。

從 c # 7.3 開始,您可以在稱為System.Enum的基類條件約束 (中使用 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您可以使用方法來判斷列舉型別是否包含具有特定關聯值的列舉成員。

針對任何列舉型別,會分別存在對類型的 裝箱和取消加入轉換。

C# 語言規格

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

另請參閱