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.

Confira também