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


Перечисления (F#)

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

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

Заметки

Перечисление во многом подобно размеченному объединению с простыми значениями, с той лишь разницей, что значения можно указать.Как правило, значениями являются целые числа от 0 или от 1, или целые числа, представляющие позиции битов.Если перечисление должно представлять позиции битов, необходимо также использовать атрибут FlagsAttribute.

Базовый тип перечисления определяется по используемому литералу, поэтому, к примеру, можно использовать литералы с суффиксами, такие как 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, uint16, uint64 и char.Типы перечисления представлены в .NET Framework как типы, наследуемые от класса Enum, в свою очередь наследуемого от 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)

См. также

Основные понятия

Приведение и преобразование (F#)

Другие ресурсы

Справочник по языку F#