Compartilhar via


Enumerações

As enumerações, também conhecidas como enumerações, 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 mantenedí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 normalmente são inteiros que começam em 0 ou 1 ou inteiros 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 do literal que é usado, de modo que, por exemplo, você pode usar literais com um sufixo, como 1u, 2ue assim por diante, para um tipo inteiro sem sinal (uint32).

Quando você se refere aos valores nomeados, deve usar o nome do próprio tipo de enumeração como um qualificador, ou seja, enum-name.value1não apenas value1. Esse 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 converter facilmente enumerações no tipo subjacente usando o operador apropriado, conforme 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, uint64e char. Os tipos de enumeração são representados no .NET Framework como tipos que são herdados de System.Enum, que por sua vez é herdado de System.ValueType. Portanto, 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 ao fazer correspondência de padrões em valores de enumeração, pois você precisa fornecer um padrão que abrange os valores sem nome.

A enum função na biblioteca F# pode ser usada para gerar um valor de enumeração, até mesmo um valor diferente de um dos valores nomeados predefinidos. Use a função enum 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 de enumerações são sempre emitidos como public. Isso é para que eles se alinhem ao C# e ao restante da plataforma .NET.

Para habilitar a correspondência completa somente para os casos de enumeração definidos, você pode suprimir o aviso FS0104 usando a diretiva #nowarn "104". Isso permite que o compilador trate apenas os valores de enumeração declarados como válidos durante a correspondência de padrões, evitando a necessidade de um caso geral — útil quando você tem certeza de que todos os valores são cobertos.

O aviso FS0104 (Enums may take values outside known cases.) existe porque as enumerações podem ser atribuídas valores subjacentes arbitrários, por exemplo, diretamente ou como resultado de operações bitwise.

Consulte também