列舉 (F#)
列舉型別,也就是 列舉,,都是整數類資料型別標籤指派值的某子集合的位置。列舉可用來取代常值,讓程式碼更容易閱讀及維護。
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
備註
列舉與具有簡單值的已區分聯集十分類似,不同之處在於可以指定值。值通常是以 0 或 1 開始的整數,或是表示位元位置的整數。如果列舉用來代表位元位置中,您也應該使用FlagsAttribute屬性。
列舉的基礎型別是從使用的常值判斷,因此,您可以使用有後置字元的常值 (例如 1u、2u 等等) 來表示不帶正負號的整數 (uint32) 型別。
當參考具名值時,您必須使用列舉型別本身的名稱做為限定詞,也就是 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
列舉型別可以有下列其中一個基礎型別:sbyte、byte、int16、uint16、int32、uint32、int64、uint16、uint64 和 char。列舉型別在 .NET Framework 中表示為繼承自 Enum 的型別,而後者繼承自 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)