Freigeben über


Enumerationen

Enumerationen, auch als Enums bezeichnet, sind integrale Datentypen, bei denen Beschriftungen einer Teilmenge der Werte zugewiesen werden. Sie können sie anstelle von Literalen verwenden, um Code besser lesbar und verwaltet zu machen.

Syntax

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

Bemerkungen

Eine Aufzählung sieht ähnlich wie eine diskriminierte Vereinigung mit einfachen Werten aus, mit der Ausnahme, dass die Werte angegeben werden können. Die Werte sind in der Regel ganze Zahlen, die mit 0 oder 1 beginnen, oder ganze Zahlen, die Bitpositionen darstellen. Wenn eine Aufzählung Bitpositionen darstellen soll, sollten Sie auch das Attribut "Flags " verwenden.

Der zugrunde liegende Typ der Aufzählung wird aus dem verwendeten Literal bestimmt, sodass Sie beispielsweise Literale mit einem Suffix wie 1u, 2uusw. für einen nicht signierten Ganzzahltyp (uint32) verwenden können.

Wenn Sie auf die benannten Werte verweisen, müssen Sie den Namen des Enumerationstyps selbst als Qualifizierer verwenden, enum-name.value1d. h. nicht nur value1. Dieses Verhalten unterscheidet sich von der von diskriminierten Gewerkschaften. Dies liegt daran, dass Enumerationen immer über das Attribut RequireQualifiedAccess verfügen.

Der folgende Code zeigt die Deklaration und 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 ganz einfach 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 Basistypen haben: sbyte, byte, int16, uint16, int32, uint32, int64, uint64 und char. Enumerationstypen sind in der .NET Framework als Typen repräsentiert, die von System.Enum erben und wiederum von System.ValueType erben. 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 wichtig, wenn der Musterabgleich für Enumerationswerte erfolgt, da Sie ein Muster bereitstellen müssen, das die unbenannten Werte abfangen soll.

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 Standardfunktion enum funktioniert mit Typ int32. Daher kann sie 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 publicausgegeben. Dies ist so, dass sie sich an C# und den rest der .NET-Plattform ausrichten.

Um einen vollständigen Abgleich nur für die definierten Enumerationsfälle zu aktivieren, können Sie die Warnung FS0104 mithilfe der Direktive #nowarn "104"unterdrücken. Auf diese Weise kann der Compiler nur deklarierte Enumerationswerte während des Musterabgleichs als gültig behandeln, wodurch die Notwendigkeit eines Catch-All-Falls vermieden wird – nützlich, wenn Sie sicher sind, dass alle Werte abgedeckt sind.

Die Warnung FS0104 (Enums may take values outside known cases.) ist vorhanden, da Enums beliebige zugrunde liegende Werte zugewiesen werden können, z. B. direkt oder als Ergebnis von bitweisen Vorgängen.

Siehe auch