Enumerazioni (F#)
Enumerazioni, note anche come enumerazioni, sono tipi integrali in cui le etichette vengono assegnate a un sottoinsieme dei valori.È possibile utilizzare le enumerazioni al posto dei valori letterali per semplificare la lettura e la gestione del codice.
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
Note
Un'enumerazione è molto simile a un'unione discriminata con valori semplici, ad eccezione del fatto che i valori possono essere specificati.I valori sono in genere numeri interi che iniziano da 0 o 1 o numeri interi che rappresentano posizioni in bit.Se un'enumerazione è utilizzata per rappresentare le posizioni di bit, è inoltre necessario utilizzare l'attributo di FlagsAttribute .
Il tipo sottostante dell'enumerazione è determinato dal valore letterale utilizzato, pertanto è ad esempio possibile utilizzare valori letterali con un suffisso, come 1u, 2u e così via, per un tipo di numero intero senza segno (uint32).
Quando si fa riferimento ai valori denominati, è necessario utilizzare il nome del tipo di enumerazione stesso come qualificatore, ovvero, enum-name.value1 e non solo value1.Questo comportamento è diverso rispetto a quello delle unioni discriminate.Ciò è dovuto al fatto che gli enumeratori presentano sempre l'attributo RequireQualifiedAccess.
Nel codice seguente vengono illustrati la dichiarazione e l'utilizzo 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 in modo semplice le enumerazioni nel tipo sottostante utilizzando 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, int32, uint32, int64, uint16, uint64 e char.I tipi di enumerazione sono rappresentati in .NET Framework come tipi ereditati da Enum, che a sua volta è ereditato da ValueType.Sono pertanto tipi di valore nello stack o inline nell'oggetto contenitore e qualsiasi valore del tipo sottostante è un valore valido dell'enumerazione.Ciò risulta particolarmente importante nel caso dei criteri di ricerca sui valori di enumerazione, in quanto è necessario fornire criterio che individui i valori senza nome.
La funzione enum nella libreria F# può essere utilizzata per generare un valore di enumerazione, anche un valore diverso da uno dei valori denominati predefiniti.Per utilizzare la funzione enum, procedere come segue.
let col2 = enum<Color>(3)
La funzione enum predefinita funziona con il tipo int32.Non può pertanto essere utilizzata con tipi di enumerazione che dispongono di altri tipi sottostanti.Utilizzare invece la funzione seguente.
type uColor =
| Red = 0u
| Green = 1u
| Blue = 2u
let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)