Перечисления (F#)
Перечисления (enum) — это типы, имеющие определенный набор именованных значений. Их можно использовать вместо литералов, чтобы сделать код удобнее для чтения и поддержки.
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
Заметки
Перечисление во многом подобно размеченному объединению с простыми значениями, с той лишь разницей, что значения можно указать. Как правило, значениями являются целые числа от 0 или от 1, или целые числа, представляющие позиции битов. Базовый тип перечисления определяется по используемому литералу, поэтому, к примеру, можно использовать литералы с суффиксами, такие как 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#)