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
, 2u
e 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.value1
non 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
, uint32
int32
int64
, , , 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.