列舉

列舉也稱為 enums,是將標籤指派給一小組值的整數型別。 列舉可用來取代常值,讓程式碼更容易閱讀及維護。

語法

type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...

備註

列舉看起來與具有簡單值的區分聯合非常類似,不同之處在於可以指定值。 這些值通常是從 0 或 1 開始的整數,或是代表位元位置的整數。 如果列舉是要代表位元位置,您應同時使用 Flags 屬性。

列舉的基礎型別取決於所使用的常值,因此,例如針對不帶正負號的整數 (uint32) 型別,您可以使用有尾碼的常值 (例如 1u2u 等等)。

當您參考具名值時,您必須使用列舉型別本身的名稱作為限定詞,也就是 enum-name.value1,而不只是 value1。 此行為與區分聯合的行為不同。 這是因為列舉一律具有 RequireQualifiedAccess 屬性。

下列程式碼顯示列舉的宣告和使用。

// Declaration of an enumeration.
type Color =
    | Red = 0
    | Green = 1
    | Blue = 2
// Use of an enumeration.
let col1: Color = Color.Red

您可以使用適當的運算子,輕鬆地將列舉轉換為基礎型別,如下列程式碼所示。

// Conversion to an integral type.
let n = int col1

列舉型別可以有下列其中一個基礎型別:sbytebyteint16uint16int32uint32int64uint64char。 列舉型別會在 .NET Framework 中表示為繼承自 System.Enum 的型別,然後接著繼承自 System.ValueType。 因此,這些型別是位於堆疊或內嵌於內含物件的實值型別,而基礎型別的任何值都是列舉的有效值。 這在列舉值的模式比對上相當重要,因為您必須提供可擷取未命名值的模式。

F# 程式庫中的 enum 函式可用來產生列舉值,甚至是預先定義具名值以外的值。 您可以使用 enum 函式,如下所示。

let col2 = enum<Color> (3)

預設的 enum 函式適用於 int32 型別。 因此,不能與具有其他基礎型別的列舉型別搭配使用。 請改用下列命令。

type uColor =
    | Red = 0u
    | Green = 1u
    | Blue = 2u

let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)

此外,列舉的案例一律會以 public 形式發出。 如此一來,便會與 C# 和 .NET 平台的其餘部分保持一致。

另請參閱