列舉,也稱為 列舉型別,是整數型別的一種,將標籤指派給值的子集。 您可以使用它們取代常值,讓程式代碼更容易閱讀及維護。
語法
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
備註
列舉看起來就像具有簡單值的歧視聯集,不同之處在於可以指定值。 值通常是從 0 或 1 開始的整數,或是表示位位置的整數。 如果列舉是要代表位元位置,您也應該使用 Flags 屬性。
列舉的基礎型別是從使用的常值決定,因此,例如,您可以針對不帶正負號的整數 (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、int16uint16int32uint32、int64、 uint64和 。char 列舉型別會在 .NET Framework 中表示為繼承自 System.Enum的類型,而後者又繼承自 System.ValueType。 因此,它們是位於包含物件的堆疊或內嵌的實值型別,而基礎型別的任何值都是列舉的有效值。 這在列舉值上進行樣式匹配時很重要,因為您需要提供一個可以捕捉非命名值的樣式。
enum F# 連結庫中的 函式可以用來產生列舉值,甚至是其中一個預先定義且具名值以外的值。 您可以如下所示使用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 平台的其餘部分保持一致。
若要只針對定義的列舉案例啟用 詳盡匹配,您可以使用指示詞 #nowarn "104"來隱藏警告 FS0104。 這可讓編譯器在進行模式匹配時只把已宣告的列舉值視為有效,避免需要使用萬用案例—當您確定所有值都已涵蓋時,這是非常有用的。
警告 FS0104 (Enums may take values outside known cases.) 的存在是因為列舉可以被指派任意底層值,例如,可能直接指派或通過位運算的結果指派。