Enumerazioni

Le enumerazioni, note anche come enumerazioni, sono tipi integrali in cui le etichette vengono assegnate a un subset dei valori. È possibile usarle in sostituzione ai valori letterali per rendere il codice più leggibile e gestibile.

Sintassi

type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...

Osservazioni:

Un'enumerazione è simile a un'unione discriminata con valori semplici, ad eccezione del fatto che è possibile specificare i valori. I valori sono in genere numeri interi che iniziano a 0 o 1 o interi che rappresentano posizioni di bit. Se un'enumerazione è destinata a rappresentare posizioni di bit, è consigliabile usare anche l'attributo Flags .

Il tipo sottostante dell'enumerazione viene determinato dal valore letterale usato, in modo che, ad esempio, sia possibile usare valori letterali con un suffisso, ad esempio 1u, 2ue così via, per un tipo integer senza segno (uint32).

Quando si fa riferimento ai valori denominati, è necessario usare il nome del tipo di enumerazione stesso come qualificatore, ovvero , enum-name.value1non solo value1. Questo comportamento è diverso da quello delle unioni discriminate. Ciò è dovuto al fatto che le enumerazioni hanno sempre l'attributo RequireQualifiedAccess .

Il codice seguente illustra la dichiarazione e l'uso di un'enumerazione.

// Declaration of an enumeration.
type Color =
    | Red = 0
    | Green = 1
    | Blue = 2
// Use of an enumeration.
let col1: Color = Color.Red

È possibile convertire facilmente le enumerazioni nel tipo sottostante usando l'operatore appropriato, come illustrato nel codice seguente.

// Conversion to an integral type.
let n = int col1

I tipi enumerati possono avere uno dei tipi sottostanti seguenti: sbyte, byte, int16, uint16, uint32int32int64, , , uint64, e .char I tipi di enumerazione sono rappresentati in .NET Framework come tipi ereditati da System.Enum, che a loro volta vengono ereditati da System.ValueType. Di conseguenza, sono tipi valore che si trovano nello stack o inline nell'oggetto contenitore e qualsiasi valore del tipo sottostante è un valore valido dell'enumerazione. Ciò è significativo quando i criteri di ricerca corrispondono ai valori di enumerazione, perché è necessario fornire un criterio che intercetta i valori senza nome.

La enum funzione nella libreria F# può essere usata per generare un valore di enumerazione, anche un valore diverso da uno dei valori denominati predefiniti. Usare la enum funzione come indicato di seguito.

let col2 = enum<Color> (3)

La funzione predefinita enum funziona con il tipo int32. Pertanto, non può essere usato con tipi di enumerazione con altri tipi sottostanti. Usare invece quanto segue.

type uColor =
    | Red = 0u
    | Green = 1u
    | Blue = 2u

let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)

Inoltre, i casi per le enumerazioni vengono sempre generati come public. In questo modo si allineano a C# e al resto della piattaforma .NET.

Vedi anche