枚举(也称为 枚举)是向值子集分配标签的整型类型。 可以使用它们代替文本,使代码更具可读性和可维护性。
语法
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
。 因此,它们是位于包含对象的堆栈或内联上的值类型,基础类型的任何值都是枚举的有效值。 当枚举值的模式匹配时,这一点非常重要,因为必须提供捕获未命名值的模式。
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.
)之所以存在,是因为枚举可以被分配任意底层值,例如直接分配或者由于按位运算导致的结果。