枚举 (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)

请参见

概念

强制转换和转换 (F#)

其他资源

F# 语言参考