Omezení (F#)

Toto téma popisuje omezení, které můžete použít k Obecné zadejte parametry, které určují požadavky pro typový parametr obecného typu nebo funkce.

type-parameter-list when constraint1 [ and constraint2]

Poznámky

Existuje několik různých omezení, které lze použít k omezení typů, které lze použít v obecném typu.Následující tabulka uvádí a popisuje tato omezení.

Omezení

Syntaxe

Description

Omezení typu

type-parameter: > type

Zadaný typ musí být rovna nebo odvozené z zadaný typ nebo pokud je typ rozhraní, zadaný typ musí implementovat rozhraní.

Null omezení

type-parameter: null

Zadaný typ musí podporovat literál null.To zahrnuje všechny typy objektů rozhraní .NET, ale není F# seznam, n-tice, funkce, třídy, záznamu nebo sjednocovací typy.

Explicitní člen omezení

[(]type-parameteror ...or type-parameter)] : (member-signature)

Nejméně jedna ze zadaných argumentů typu musí být člen, který má zadaný podpis; nejsou určeny pro běžné použití.

Konstruktor omezení

type-parameter: (nové: -> jednotka ")

Zadaný typ musí mít výchozí konstruktor.

Omezení typu hodnoty

: struktura

Zadaný typ musí být typu hodnoty .NET.

Odkazového typu

: není struktura

Zadaný typ musí být typem odkazu .NET.

Omezení typu výčtu

: enum<underlying-type>

Zadaný typ musí být výčtového typu, který má zadaný základní typ; nejsou určeny pro běžné použití.

Delegát omezení

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

Zadaný typ musí být typu delegáta, který má zadané argumenty a vrátí hodnotu; nejsou určeny pro běžné použití.

Porovnání omezení

: porovnání

Zadaný typ musí podporovat porovnání.

Omezení rovnosti

: rovnost

Zadaný typ musí podporovat rovnost.

Nespravované omezení

: nespravované

Zadaný typ musí být nespravovaný typ.Unmanaged types are either certain primitive types (sbyte, byte, char, nativeint, unativeint, float32, float, int16, uint16, int32, uint32, int64, uint64, or decimal), enumeration types, nativeptr<_>, or a non-generic structure whose fields are all unmanaged types.

Budete muset přidat omezení při použití funkce, která je k dispozici na typ omezení, ale nikoli na typy obecně má váš kód.Například omezení typu umožňuje určit typ třídy, můžete použít jednu z metod třídy v obecné funkce nebo typu.

Určení omezení je někdy požadován při psaní parametry typu explicitně, protože bez omezení, kompilátor nemůže ověřovat, že funkce, které používáte, bude k dispozici pro jakýkoli typ, který může být dodán v době běhu pro parametr typu.

Nejběžnější omezující podmínky, které použijete v kódu jazyka F# jsou typ omezení, které určují základní třídy nebo rozhraní.Jiná omezení knihovnou jazyka F# slouží buď k implementaci určité funkce, například omezení pro explicitní člen, který se používá k provedení aritmetických operátorů přetěžování operátoru nebo jsou k dispozici zejména proto, že F# podporuje úplnou sadu omezení podporovaný společného jazykového modulu runtime.

Během procesu odvození typu jsou automaticky odvozeny některá omezení kompilátorem.Použijete-li například + operátor ve funkci, kompilátor odvodí omezením explicitní člen na typy proměnných, které se používají ve výrazu.

Následující kód ilustruje některé deklarace omezení.

// Base Type Constraint
type Class1<'T when 'T :> System.Exception> =
    class end

// Interface Type Constraint
type Class2<'T when 'T :> System.IComparable> = 
    class end

// Null constraint
type Class3<'T when 'T : null> =
    class end

// Member constraint with static member
type Class4<'T when 'T : (static member staticMethod1 : unit -> 'T) > =
    class end

// Member constraint with instance member
type Class5<'T when 'T : (member Method1 : 'T -> int)> =
    class end

// Member constraint with property
type Class6<'T when 'T : (member Property1 : int)> =
    class end

// Constructor constraint
type Class7<'T when 'T : (new : unit -> 'T)>() =
   member val Field = new 'T()

// Reference type constraint
type Class8<'T when 'T : not struct> =
   class end

// Enumeration constraint with underlying value specified
type Class9<'T when 'T : enum<uint32>> =
   class end

// 'T must implement IComparable, or be an array type with comparable
// elements, or be System.IntPtr or System.UIntPtr. Also, 'T must not have
// the NoComparison attribute.
type Class10<'T when 'T : comparison> =
   class end

// 'T must support equality. This is true for any type that does not
// have the NoEquality attribute.
type Class11<'T when 'T : equality> =
   class end

type Class12<'T when 'T : delegate<obj * System.EventArgs, unit>> =
   class end

type Class13<'T when 'T : unmanaged> =
   class end
    
// Member constraints with two type parameters
// Most often used with static type parameters in inline functions
let inline add(value1 : ^T when ^T : (static member (+) : ^T * ^T -> ^T), value2: ^T) =
    value1 + value2

// ^T and ^U must support operator +
let inline heterogenousAdd(value1 : ^T when (^T or ^U) : (static member (+) : ^T * ^U -> ^T), value2 : ^U) =
    value1 + value2

// If there are multiple constraints, use the and keyword to separate them.
type Class14<'T,'U when 'T : equality and 'U : equality> =
    class end

Viz také

Referenční dokumentace

Obecné typy (F#)

Omezení (F#)