枚举 (F#)
“枚举”,也称为“enums”,是具有一组已定义的命名值的类型。 可以使用枚举来代替文本,以增强代码的可读性和可维护性。
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
备注
枚举与具有简单值的可区分联合非常相似,不同的是可以指定这些值。 这些值通常是从 0 或 1 开始的整数,或表示数位位置的整数。 枚举的基础类型将由所使用的文本确定,因此,举例来说,对于无符号整数 (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、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)