Поделиться через


Перечисления

Перечисления, также известные как энумы, являются целочисленными типами, в которых метки назначаются подмножеству значений. Их можно использовать вместо литерала, чтобы сделать код более читаемым и поддерживаемым.

Синтаксис

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.

Чтобы включить исчерпывающее сопоставление только для определенных случаев перечисления, можно отключить предупреждение FS0104 с помощью директивы #nowarn "104". Это позволяет компилятору обрабатывать только объявленные значения перечисления как допустимые во время сопоставления шаблонов, избегая необходимости использовать универсальный случай, что полезно, если вы уверены, что все значения учтены.

Предупреждение FS0104 (Enums may take values outside known cases.) существует, так как перечислениям могут быть присвоены произвольные базовые значения, например, напрямую или в результате побитовых операций.

См. также