Enumerationen

Enumerationen, auch als Enums bezeichnet, sind integrale Typen, bei denen Bezeichnungen einer Teilmenge der Werte zugewiesen werden. Sie können diese anstelle von Literalen verwenden, um Code lesbarer und verwaltbarer zu machen.

Syntax

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

Bemerkungen

Eine Enumeration ähnelt einer diskriminierten Union, die einfache Werte aufweist, mit der Ausnahme, dass die Werte angegeben werden können. Die Werte sind in der Regel Integerwerte, die bei 0 oder 1 beginnen, oder Integerwerte, die Bitpositionen darstellen. Wenn eine Enumeration Bitpositionen darstellen soll, sollten Sie auch das Flags-Attribut verwenden.

Der zugrunde liegende Typ der Enumeration wird anhand des verwendeten Literals bestimmt, sodass Sie beispielsweise Literale mit einem Suffix wie 1u, 2u usw. für einen Integertyp ohne Vorzeichen (uint32) verwenden können.

Wenn Sie auf die benannten Werte verweisen, müssen Sie den Namen des Enumerationstyps selbst als Qualifizierer verwenden, also enum-name.value1 (nicht nur value1). Dieses Verhalten unterscheidet sich von dem Verhalten diskriminierter Unions. Dies liegt daran, dass Enumerationen immer über das RequireQualifiedAccess-Attribut verfügen.

Der folgende Code zeigt die Deklaration und die Verwendung einer Enumeration.

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

Sie können Enumerationen problemlos in den zugrunde liegenden Typ konvertieren, indem Sie den entsprechenden Operator verwenden, wie im folgenden Code gezeigt.

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

Aufzählungstypen können einen der folgenden zugrunde liegenden Typen aufweisen: sbyte, byte, int16, uint16, int32, uint32, int64, uint64 und char. Enumerationstypen werden in .NET Framework als Typen dargestellt, die von System.Enum geerbt werden, was wiederum von System.ValueType geerbt wird. Daher handelt es sich um Werttypen, die sich im Stapel oder inline im enthaltenden Objekt befinden, und jeder Wert des zugrunde liegenden Typs ist ein gültiger Wert der Enumeration. Dies ist beim Musterabgleich mit Enumerationswerten von Bedeutung, weil Sie ein Muster bereitstellen müssen, das die unbenannten Werte abfängt.

Die enum-Funktion in der F#-Bibliothek kann verwendet werden, um einen Enumerationswert zu generieren, sogar einen anderen Wert als einen der vordefinierten benannten Werte. Sie verwenden die enum-Funktion wie folgt.

let col2 = enum<Color> (3)

Die enum-Standardfunktion funktioniert mit dem Typ int32. Sie kann daher nicht mit Enumerationstypen verwendet werden, die andere zugrunde liegende Typen aufweisen. Verwenden Sie stattdessen Folgendes.

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

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

Darüber hinaus werden Fälle für Enumerationen immer als public ausgegeben. Dies geschieht, damit sie mit C# und dem Rest der .NET-Plattform kompatibel sind.

Weitere Informationen