Kısıtlamaları (F#)
Bu konu, genel için uygulayabileceğiniz kısıtlamaları açıklar bir genel tür ya da işlev gereksinimleri için tür bağımsız değişkeni belirtmek için parametreleri yazın.
type-parameter-list when constraint1 [ and constraint2]
Notlar
Genel tür içinde kullanılan sınırlandırmak için uygulayabileceğiniz birkaç farklı kısıtlamaları vardır. Aşağıdaki tabloda, listeler ve bu kısıtlamaları açıklar.
Kısıtlama |
Sözdizimi |
Tanımlama |
---|---|---|
Tür kısıtlaması |
type-parameter: > type |
Sağlanan tür değerine eşit veya türetilmiş belirtilen türde olmalıdır veya sağlanan türü bir arabirim türü ise, arabirimini uygulamalıdır. |
Null kısıtlaması |
type-parameter: null |
Sağlanan tür null sabit desteklemesi gerekir. Bu, tüm .NET nesne türleri ancak değil F# listesi, kayıt, işlev, sınıf, kayıt veya birleşim türlerini içerir. |
Açık üye kısıtlaması |
[(]type-parameteror ... or type-parameter)] : (member-signature) |
Sağlanan tür bağımsız değişkeni en az bir üyesi belirtilen imzaya sahip olması gerekir; yaygın kullanım amacı değildir. |
Yapıcı kısıtlama |
type-parameter: (yeni: birim -> bir) |
Sağlanan tür varsayılan bir oluşturucusu olması gerekir. |
Değer türü kısıtlaması |
: yapı |
Sağlanan tür .NET değer türünde olmalıdır. |
Başvuru türü kısıtlaması |
: yapı değil |
Sağlanan tür .NET başvuru türü olmalıdır. |
Numaralandırma türü kısıtlaması |
: enum<underlying-type> |
Sağlanan tür numaralandırılmış türe belirtilen temel türüne sahip olması gerekir; yaygın kullanım amacı değildir. |
Temsilci kısıtlama |
: delegate<tuple-parameter-type, return-type> |
Sağlanan tür, belirtilen bağımsız değişken olan bir temsilci türü olmalıdır ve değerini döndürür; yaygın kullanım amacı değildir. |
Karşılaştırma kısıtlama |
: karşılaştırma |
Sağlanan tür karşılaştırmayı desteklemesi gerekir. |
Eşitlik kısıtlaması |
: eşitlik |
Sağlanan tür eşitlik desteklemesi gerekir. |
Yönetilmeyen kısıtlama |
: yönetilmeyen |
Sağlanan tür yönetilmeyen bir tür olmalıdır. 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. |
Genel sınırlama türü ancak değil üzerinde türleri üzerinde var olan bir özelliği kullanmak kodunuzu sahip olduğunda bir kısıtlama eklemek vardır. Örneğin, bir sınıf türü belirtmek için tür kısıtlaması kullanırsanız, o sınıfın genel işlevini veya türünü yöntemlerden birini kullanabilirsiniz.
Bir kısıtlama derleyici, kullandığınız özellikleri kullanılabilir tür parametresi için çalışma zamanında sağlanması herhangi bir tür üzerinde doğrulama hiçbir yolu yoktur çünkü kısıtlamalar belirtme bazen tür parametreleri açıkça yazarken gereklidir.
F# kodunda kullanmak en yaygın kısıtlamaları temel sınıfları veya arabirimleri belirleme türü kısıtlamaları var. Diğer kısıtlamalar çoğunlukla F# ortak dil çalışma zamanı tarafından desteklenen tüm kısıtlamalar kümesini desteklediğinden sağlanan veya aritmetik işleçleri Ýþleç uygulamak için kullanılan açık üye kısıtlama gibi belirli işlevleri gerçekleştirmek için F# kitaplığı tarafından da kullanılır.
Tür çıkarımı işlemi sırasında bazı sınırlamalarla derleyicisi tarafından otomatik olarak algılanır. Kullanıyorsanız, örneğin, + bir işlev işleci, derleyici içerilen bir deyim içinde kullanılan değişken türleri açık üye kısıtlaması.
Aşağıdaki kod, bazı kısıtlama bildirimleri gösterir.
// 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