Enumerazioni (F#)
Le enumerazioni, note anche come enums, sono tipi con un set definito di valori denominati. È 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. 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)