枚举
枚举(也称为“enums”)是整型类型,其中标签分配给值的子集。 可以使用它们来代替文本,使代码更具可读性且更易维护。
语法
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
、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 平台的其余部分保持一致。