枚举

枚举(也称为 枚举)是向值子集分配标签的整型类型。 可以使用它们代替文本,使代码更具可读性和可维护性。

语法

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

枚举类型可以具有以下基础类型之一:sbyte、、、byte、、int16uint16int32uint32int64uint64char。 枚举类型在 .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.)之所以存在,是因为枚举可以被分配任意底层值,例如直接分配或者由于按位运算导致的结果。

另请参阅