列舉
列舉也稱為 enums,是將標籤指派給一小組值的整數型別。 列舉可用來取代常值,讓程式碼更容易閱讀及維護。
語法
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
備註
列舉看起來與具有簡單值的區分聯合非常類似,不同之處在於可以指定值。 這些值通常是從 0 或 1 開始的整數,或是代表位元位置的整數。 如果列舉是要代表位元位置,您應同時使用 Flags 屬性。
列舉的基礎型別取決於所使用的常值,因此,例如針對不帶正負號的整數 (uint32
) 型別,您可以使用有尾碼的常值 (例如 1u
、2u
等等)。
當您參考具名值時,您必須使用列舉型別本身的名稱作為限定詞,也就是 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
、uint64
和 char
。 列舉型別會在 .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 平台的其餘部分保持一致。