Enumerações
Enumerações, também conhecidas como enums, são tipos integrais onde 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 sustentável.
Sintaxe
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
Observações
Uma enumeração se parece muito com uma união discriminada que tem valores simples, exceto que os valores podem ser especificados. Os valores são normalmente inteiros que começam em 0 ou 1, ou inteiros que representam posições de bits. Se uma enumeração se destinar a representar posições de bits, você também deve usar o atributo Flags .
O tipo subjacente da enumeração é determinado a partir do literal que é usado, de modo que, por exemplo, você pode usar literais com um sufixo, como 1u
, 2u
e assim por diante, para um tipo inteiro (uint32
) não assinado.
Quando você se refere aos valores nomeados, você deve usar o nome do próprio tipo de enumeração como um qualificador, ou seja, enum-name.value1
não apenas value1
. Este comportamento difere do dos sindicatos discriminados. 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 facilmente converter enumerações para o tipo subjacente usando o operador apropriado, conforme mostrado no código a seguir.
// Conversion to an integral type.
let n = int col1
Os 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 do System.Enum
, que, por sua vez, é herdado do System.ValueType
. Assim, eles são tipos de valor que estão 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 em valores de enumeração, porque você precisa fornecer um padrão que captura os valores sem nome.
A enum
função na biblioteca F# pode ser usada para gerar um valor de enumeração, mesmo um valor diferente de um dos valores nomeados predefinidos. Você usa a enum
função da seguinte maneira.
let col2 = enum<Color> (3)
A função padrão enum
funciona com o tipo int32
. Portanto, ele não pode ser usado com tipos de enumeração que têm 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 enums são sempre emitidos como public
. Isso é para que eles se alinhem com o C# e o resto da plataforma .NET.