Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Les énumérations, également appelées énumérations, sont des types intégraux où les étiquettes sont affectées à un sous-ensemble des valeurs. Vous pouvez les utiliser à la place de littéraux pour rendre le code plus lisible et plus facile à gérer.
Syntaxe
type enum-name =
| value1 = integer-literal1
| value2 = integer-literal2
...
Remarques
Une énumération ressemble beaucoup à une union discriminée qui a des valeurs simples, sauf que les valeurs peuvent être spécifiées. Les valeurs sont généralement des entiers qui commencent à 0 ou 1, ou des entiers qui représentent des positions de bits. Si une énumération est destinée à représenter des positions de bits, vous devez également utiliser l’attribut Indicateurs .
Le type sous-jacent de l’énumération est déterminé à partir du littéral utilisé, de sorte que, par exemple, vous pouvez utiliser des littéraux avec un suffixe, tel que 1u, 2uet ainsi de suite, pour un type entier non signé (uint32).
Lorsque vous faites référence aux valeurs nommées, vous devez utiliser le nom du type d’énumération lui-même comme qualificateur, c’est-à-dire, enum-name.value1pas seulement value1. Ce comportement diffère de celui des syndicats discriminés. Cela est dû au fait que les énumérations ont toujours l’attribut RequireQualifiedAccess .
Le code suivant montre la déclaration et l’utilisation d’une énumération.
// Declaration of an enumeration.
type Color =
| Red = 0
| Green = 1
| Blue = 2
// Use of an enumeration.
let col1: Color = Color.Red
Vous pouvez facilement convertir des énumérations en type sous-jacent à l’aide de l’opérateur approprié, comme indiqué dans le code suivant.
// Conversion to an integral type.
let n = int col1
Les types énumérés peuvent avoir l’un des types sous-jacents suivants : sbyte, , byteint16, uint16, int32, , uint32, int64, uint64, et char. Les types d’énumération sont représentés dans le .NET Framework en tant que types hérités de System.Enum, qui à leur tour sont hérités de System.ValueType. Ainsi, il s’agit de types valeur situés sur la pile ou en ligne dans l’objet conteneur, et toute valeur du type sous-jacent est une valeur valide de l’énumération. Cela est significatif lorsque le modèle correspond aux valeurs d’énumération, car vous devez fournir un modèle qui intercepte les valeurs non nommées.
La enum fonction de la bibliothèque F# peut être utilisée pour générer une valeur d’énumération, même une valeur autre qu’une des valeurs nommées prédéfinies. Vous utilisez la enum fonction comme suit.
let col2 = enum<Color> (3)
La fonction par défaut enum fonctionne avec le type int32. Par conséquent, il ne peut pas être utilisé avec des types d’énumération qui ont d’autres types sous-jacents. Utilisez plutôt ce qui suit.
type uColor =
| Red = 0u
| Green = 1u
| Blue = 2u
let col3 = Microsoft.FSharp.Core.LanguagePrimitives.EnumOfValue<uint32, uColor>(2u)
En outre, les cas d’énumération sont toujours émis en tant que public. C’est ainsi qu’ils s’alignent sur C# et le reste de la plateforme .NET.
Pour activer une correspondance exhaustive uniquement pour les cas d’énumération définis, vous pouvez supprimer l’avertissement FS0104 à l’aide de la directive #nowarn "104". Cela permet au compilateur de traiter uniquement les valeurs d’énumération déclarées comme valides pendant la mise en correspondance des modèles, ce qui évite d’avoir besoin d’un cas catch-all , utile lorsque vous êtes certain que toutes les valeurs sont couvertes.
L’avertissement FS0104 (Enums may take values outside known cases.) existe, car les énumérations peuvent être affectées à des valeurs sous-jacentes arbitraires, par exemple, directement ou en raison d’opérations au niveau du bit.