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