Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
.NET Framework 4, çeşitli mevcut genel arabirimler için varyans desteği sunar. Varyans desteği, bu arabirimleri uygulayan sınıfların örtük olarak dönüştürülmesi sağlar. Aşağıdaki arabirimler artık değişkendir:
IEnumerable<T> (T birlikte değişkendir)
IEnumerator<T> (T birlikte değişkendir)
IQueryable<T> (T birlikte değişkendir)
IGrouping<TKey,TElement> (
TKeyveTElementbirlikte değişkendir)IComparer<T> (T değişken karşıtıdır)
IEqualityComparer<T> (T değişken karşıtıdır)
IComparable<T> (T değişken karşıtıdır)
Kovaryans, bir yöntemin arabirimin genel tür parametresi tarafından tanımlanandan daha türetilmiş bir dönüş türüne sahip olmasına izin verir. Kovaryans özelliğini göstermek için şu genel arabirimleri göz önünde bulundurun: IEnumerable(Of Object) ve IEnumerable(Of String).
IEnumerable(Of String) arabirimi, IEnumerable(Of Object) arabirimini devralmıyor. Ancak, String türü, Object türünü devralır ve bazı durumlarda bu arabirimlerin nesnelerini birbirine atamak isteyebilirsiniz. Bu, aşağıdaki kod örneğinde gösterilmiştir.
Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings
.NET Framework'ün önceki sürümlerinde, bu kod Visual Basic'te Option Strict On ile bir derleme hatasına neden olur. Artık, önceki örnekte gösterildiği gibi, strings arabirimi birlikte değişken olduğu için objects yerine IEnumerable<T> kullanabilirsiniz.
Contravariance, bir yöntemin arabiriminin genel parametresi tarafından belirtilenden daha az türetilmiş bağımsız değişken türlerine sahip olmasına izin verir. Kontravaryansı göstermek için, BaseComparer sınıfının örneklerini karşılaştırmak amacıyla bir BaseClass sınıfı oluşturduğunuzu varsayalım.
BaseComparer sınıfı, IEqualityComparer(Of BaseClass) arabirimini uygular.
IEqualityComparer<T> Arabirim artık değişkensiz olduğundan, sınıfı devralan BaseComparer sınıfların örneklerini karşılaştırmak için kullanabilirsinizBaseClass. Bu, aşağıdaki kod örneğinde gösterilmiştir.
' Simple hierarchy of classes.
Class BaseClass
End Class
Class DerivedClass
Inherits BaseClass
End Class
' Comparer class.
Class BaseComparer
Implements IEqualityComparer(Of BaseClass)
Public Function Equals1(ByVal x As BaseClass,
ByVal y As BaseClass) As Boolean _
Implements IEqualityComparer(Of BaseClass).Equals
Return (x.Equals(y))
End Function
Public Function GetHashCode1(ByVal obj As BaseClass) As Integer _
Implements IEqualityComparer(Of BaseClass).GetHashCode
Return obj.GetHashCode
End Function
End Class
Sub Test()
Dim baseComparer As IEqualityComparer(Of BaseClass) = New BaseComparer
' Implicit conversion of IEqualityComparer(Of BaseClass) to
' IEqualityComparer(Of DerivedClass).
Dim childComparer As IEqualityComparer(Of DerivedClass) = baseComparer
End Sub
Daha fazla örnek için bkz. Genel Koleksiyonlar için Arabirimlerde Varyansı Kullanma (Visual Basic)...
Genel arabirimlerdeki varyans yalnızca başvuru türleri için desteklenir. Değer türleri varyansı desteklemez. Örneğin, IEnumerable(Of Integer) öğesi, tamsayılar bir değer türüyle temsil edildiğinden IEnumerable(Of Object) öğesine örtük olarak dönüştürülemez.
Dim integers As IEnumerable(Of Integer) = New List(Of Integer)
' The following statement generates a compiler error
' with Option Strict On, because Integer is a value type.
' Dim objects As IEnumerable(Of Object) = integers
Değişken arabirimleri uygulayan sınıfların hala sabit olduğunu unutmamak da önemlidir. Örneğin, List<T> değişken ara birimini IEnumerable<T> uygulasa da, List(Of Object)'yi List(Of String)'ye örtük olarak dönüştüremezsiniz. Bu, aşağıdaki kod örneğinde gösterilmiştir.
' The following statement generates a compiler error
' because classes are invariant.
' Dim list As List(Of Object) = New List(Of String)
' You can use the interface object instead.
Dim listObjects As IEnumerable(Of Object) = New List(Of String)