列舉型別(或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
}
}
如需詳細資訊和範例,請參閱 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使用方法來判斷列舉類型是否包含具有特定關聯值的列舉成員。
對於任何列舉型別,分別有 Boxing 和 unboxing 轉換到 型別和從 System.Enum 類型轉換。
C# 語言規格
如需詳細資訊,請參閱 C# 語言規格的下列幾節: