Enumerações
Enumerações, também conhecidas como enums, são tipos integrais em que os rótulos são atribuídos a um subconjunto dos valores. Você pode usá-los no lugar de literais para tornar o código mais legível e fácil de manter.
Sintaxe
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
Comentários
Uma enumeração se parece muito com uma união discriminada com valores simples, exceto que os valores podem ser especificados. Os valores normalmente são inteiros que começam em 0 ou 1, ou que representam posições de bit. Se uma enumeração for destinada a representar posições de bit, você também deverá usar o atributo Flags.
O tipo subjacente da enumeração é determinado pelo literal usado, para que, por exemplo, você possa usar literais com um sufixo, como 1u
, 2u
e assim por diante, para um tipo inteiro sem sinal (uint32
).
Ao se referir aos valores nomeados, você precisa usar o nome do próprio tipo de enumeração como um qualificador, ou seja, enum-name.value1
, não apenas value1
. Esse comportamento difere do das uniões discriminadas. Isso ocorre porque as enumerações sempre têm o atributo RequireQualifiedAccess.
O código a seguir mostra a declaração e o uso de uma enumeração.
// Declaration of an enumeration.
type Color =
| Red = 0
| Green = 1
| Blue = 2
// Use of an enumeration.
let col1: Color = Color.Red
Você pode converter facilmente enumerações no tipo subjacente usando o operador apropriado, como mostrado no código a seguir.
// Conversion to an integral type.
let n = int col1
Tipos enumerados podem ter um dos seguintes tipos subjacentes: sbyte
, byte
, int16
, uint16
, int32
, uint32
, int64
, uint64
e char
. Os tipos de enumeração são representados no .NET Framework como tipos herdados de System.Enum
, que, por sua vez, são herdados de System.ValueType
. Assim, eles são tipos de valor localizados na pilha ou embutidos no objeto que contém, e qualquer valor do tipo subjacente é um valor válido da enumeração. Isso é significativo quando o padrão corresponde a valores de enumeração, porque você precisa fornecer um padrão que captura os valores sem nome.
A função enum
na biblioteca F# pode ser usada para gerar um valor de enumeração, até mesmo um valor diferente dos nomeados predefinidos. Você usa a função enum
da seguinte maneira.
let col2 = enum<Color> (3)
A função enum
padrão funciona com o tipo int32
. Portanto, ele não pode ser usada com tipos de enumeração com outros tipos subjacentes. Em vez disso, use o seguinte.
type uColor =
| Red = 0u
| Green = 1u
| Blue = 2u
let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)
Além disso, os casos para enumerações são sempre emitidos como public
. Isso é para que eles se alinhem com o C# e o restante da plataforma .NET.