枚举

枚举(也称为“enums”)是整型类型,其中标签分配给值的子集。 可以使用它们来代替文本,使代码更具可读性且更易维护。

语法

type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...

备注

枚举看起来非常类似于具有简单值的可区分联合,不同之处在于可以指定值。 这些值通常是从 0 或 1 开始的整数,或表示位位置的整数。 如果枚举旨在表示位位置,则还应使用 Flags 特性。

枚举的基础类型由所使用的文本确定,所以,举个例子,可以将带后缀(如 1u2u 等)的文本用于无符号整数 (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

枚举类型可以具有以下基础类型之一:sbytebyteint16uint16int32uint32int64uint64char。 枚举类型在 .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 平台的其余部分保持一致。

另请参阅