Freigeben über


Einschränkungen (F#)

In diesem Thema werden Einschränkungen beschrieben, die Sie auf generische Typparameter anwenden können, um die Anforderungen für ein Typargument in einem generischen Typ oder einer generischen Funktion anzugeben.

type-parameter-list when constraint1 [ and constraint2]

Hinweise

Sie können verschiedene Einschränkungen anwenden, um die Typen zu begrenzen, die in einem generischen Typ verwendet werden können. Diese Einschränkungen werden in der folgenden Tabelle aufgeführt und beschrieben.

Einschränkung

Syntax

Beschreibung

Typeinschränkung

type-parameter :> type

Der bereitgestellte Typ muss gleich dem angegebenen Typ oder von diesem abgeleitet sein, oder der bereitgestellte Typ muss die Schnittstelle des angegebenen Typs implementieren, falls dieser eine Schnittstelle ist.

NULL-Einschränkung

type-parameter : null

Der bereitgestellte Typ muss das NULL-Literal unterstützen. Dies schließt alle .NET-Objekttypen ein, jedoch keine Listen-, Tupel-, Funktions-, Klassen-, Datensatz- oder Uniontypen von F#.

Explizite Membereinschränkung

type-parameter [oder ... oder type-parameter]: member-signature

Mindestens eines der bereitgestellten Typargumente muss über einen Member mit der angegebenen Signator verfügen. Nicht für die allgemeine Verwendung vorgesehen.

Konstruktoreinschränkung

type-parameter : ( new : unit -> 'a )

Der bereitgestellte Typ muss über einen Standardkonstruktor verfügen.

Werttypeinschränkung

: struct

Der bereitgestellte Typ muss ein .NET-Werttyp sein.

Verweistypeinschränkung

: not struct

Der bereitgestellte Typ muss ein .NET-Verweistyp sein.

Enumerationstypeinschränkung

: enum<underlying-type>

Der bereitgestellte Typ muss ein Aufzählungstyp des angegebenen zugrunde liegenden Typs sein. Nicht für die allgemeine Verwendung vorgesehen.

Delegateinschränkung

: delegate<tuple-parameter-type, return-type>

Der bereitgestellte Typ muss ein Delegattyp sein, der über die angegebenen Argumente und den angegebenen Rückgabewert verfügt. Nicht für die allgemeine Verwendung vorgesehen.

Vergleichseinschränkung

: Vergleich

Der bereitgestellte Typ muss den Vergleich unterstützen.

Gleichheitseinschränkung

: Gleichheit

Der bereitgestellte Typ muss Gleichheit unterstützen.

Nicht verwaltete Einschränkung

: nicht verwaltet

Der bereitgestellte Typ muss ein nicht verwalteter Typ sein. Nicht verwaltete Typen sind entweder bestimmte primitive Typen (sbyte, byte, char, nativeint, unativeint, float32, float, int16, uint16, int32, uint32, int64, uint64 oder decimal), Enumerationstypen, nativeptr<_> oder eine nicht generische Struktur, deren Felder alle nicht verwaltete Typen sind.

Sie müssen eine Einschränkung hinzufügen, wenn im Code eine Funktion verwendet werden muss, die für den Einschränkungstyp, jedoch nicht für Typen im Allgemeinen verfügbar ist. Wenn Sie beispielsweise mithilfe der Typeinschränkung einen Klassentyp angeben, können Sie in der generischen Funktion oder im generischen Typ jede Methode dieser Klasse verwenden.

Einschränkungen müssen beim expliziten Schreiben von Typparametern gelegentlich angegeben werden, da ohne Einschränkung der Compiler nicht überprüfen kann, ob die verwendeten Funktionen für jeden Typ verfügbar sind, der zur Laufzeit für den Typparameter angegeben werden kann.

Die häufigsten Einschränkungen, die Sie in F#-Code verwenden, sind Typeinschränkungen, die Basisklassen oder -schnittstellen angeben. Die anderen Einschränkungen werden entweder von der F#-Bibliothek verwendet, um eine bestimmte Funktionalität zu implementieren, z. B. die explizite Membereinschränkung, mithilfe derer Operatorüberladung für arithmetische Operatoren implementiert wird, oder sie werden hauptsächlich bereitgestellt, weil F# alle Einschränkungen unterstützt, die von der Common Language Runtime unterstützt werden.

Während des Typrückschlusses werden einige Einschränkungen automatisch vom Compiler abgeleitet. Wenn Sie z. B. den Operator + in einer Funktion verwenden, leitet der Compiler eine explizite Membereinschränkung für Variablentypen ab, die im Ausdruck verwendet werden.

Siehe auch

Referenz

Generika (F#)

Einschränkungen (F#)