Kısıtlamalar
Bu konu başlığında, genel tür veya işlevdeki tür bağımsız değişkeninin gereksinimlerini belirtmek için genel tür parametrelerine uygulayabileceğiniz kısıtlamalar açıklanmaktadır.
Sözdizimi
type-parameter-list when constraint1 [ and constraint2]
Açıklamalar
Genel bir türde kullanılabilecek türleri sınırlamak için uygulayabileceğiniz birkaç farklı kısıtlama vardır. Aşağıdaki tabloda bu kısıtlamalar listelenip açıklanmaktadır.
Kısıtlama | Sözdizimi | Açıklama |
---|---|---|
Tür Kısıtlaması | type-parameter :>type | Sağlanan tür belirtilen türe eşit veya türetilmiş olmalıdır ya da tür bir arabirimse sağlanan türün arabirimi uygulaması gerekir. |
Null Kısıtlaması | type-parameter : null | Sağlanan tür null değişmez değerini desteklemelidir. Bu, tüm .NET nesne türlerini içerir ancak F# listesi, tanımlama grubu, işlev, sınıf, kayıt veya birleşim türlerini içermez. |
Açık Üye Kısıtlaması | [(]type-parameter [veya ... veya type-parameter)] : (üye imzası) | Sağlanan tür bağımsız değişkenlerinden en az birinin belirtilen imzaya sahip bir üyesi olmalıdır; ortak kullanım için tasarlanmamıştır. Üyeler, Açık Üye Kısıtlaması için geçerli hedefler olmak üzere örtük tür uzantısının türünde veya parçasında açıkça tanımlanmalıdır. |
Oluşturucu Kısıtlaması | type-parameter : ( new : unit -> 'a ) | Sağlanan tür parametresiz bir oluşturucuya sahip olmalıdır. |
Değer Türü Kısıtlaması | type-parameter : struct | Sağlanan tür bir .NET değer türü olmalıdır. |
Başvuru Türü Kısıtlaması | type-parameter : yapı değil | Sağlanan tür bir .NET başvuru türü olmalıdır. |
Numaralandırma Türü Kısıtlaması | type-parameter : enum<underlying-type> | Sağlanan tür, belirtilen temel türe sahip bir numaralandırılmış tür olmalıdır; ortak kullanım için tasarlanmamıştır. |
Temsilci Kısıtlaması | type-parameter : delegate<tuple-parameter-type, return-type> | Sağlanan tür, belirtilen bağımsız değişkenlere ve dönüş değerine sahip bir temsilci türü olmalıdır; ortak kullanım için tasarlanmamıştır. |
Karşılaştırma Kısıtlaması | type-parameter : karşılaştırma | Sağlanan tür karşılaştırmayı desteklemelidir. |
Eşitlik Kısıtlaması | type-parameter : equality | Sağlanan tür eşitliği desteklemelidir. |
Yönetilmeyen Kısıtlama | type-parameter : unmanaged | Sağlanan tür yönetilmeyen bir tür olmalıdır. Yönetilmeyen türler, belirli temel türler (sbyte , byte , char , nativeint , unativeint , float32 , float , uint32 int16 int32 uint16 , , int64 , , uint64 veya decimal ), numaralandırma türleri nativeptr<_> veya alanları yönetilmeyen türler olan genel olmayan bir yapıdır. |
Kodunuzun kısıtlama türünde kullanılabilen ancak genel olarak türlerde bulunmayan bir özellik kullanması gerektiğinde kısıtlama eklemeniz gerekir. Örneğin, bir sınıf türü belirtmek için tür kısıtlamasını kullanırsanız, genel işlevde veya türdeki bu sınıfın yöntemlerinden herhangi birini kullanabilirsiniz.
Tür parametreleri açıkça yazılırken bazen kısıtlamalar belirtilmesi gerekir, çünkü kısıtlama olmadan, derleyicinin kullandığınız özelliklerin tür parametresi için çalışma zamanında sağlanabilecek herhangi bir türde kullanılabilir olduğunu doğrulama yolu yoktur.
F# kodunda kullandığınız en yaygın kısıtlamalar, temel sınıfları veya arabirimleri belirten tür kısıtlamalarıdır. Diğer kısıtlamalar, F# kitaplığı tarafından aritmetik işleçler için işleç aşırı yüklemesini uygulamak için kullanılan açık üye kısıtlaması gibi belirli işlevleri uygulamak için kullanılır veya temel olarak F# ortak dil çalışma zamanı tarafından desteklenen tüm kısıtlamaları desteklediğinden sağlanır.
Tür çıkarım işlemi sırasında bazı kısıtlamalar derleyici tarafından otomatik olarak çıkarılır. Örneğin, işlecini +
bir işlevde kullanırsanız, derleyici ifadede kullanılan değişken türlerinde açık bir üye kısıtlaması çıkartır.
Aşağıdaki kod bazı kısıtlama bildirimlerini 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 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