Share via


Temsilcilerdeki Fark (Visual Basic)

.NET Framework 3.5, C# ve Visual Basic'teki tüm temsilcilerde temsilci türleriyle eşleşen yöntem imzaları için varyans desteği sunar. Bu, temsilcilere yalnızca eşleşen imzaları olan yöntemleri değil, aynı zamanda daha fazla türetilmiş tür (kovaryans) döndüren veya temsilci türü tarafından belirtilenden daha az türetilmiş türe (ters değişken) sahip parametreleri kabul eden yöntemleri de atayabileceğiniz anlamına gelir. Buna hem genel hem de genel olmayan temsilciler dahildir.

Örneğin, iki sınıfı ve iki temsilcisi olan aşağıdaki kodu göz önünde bulundurun: genel ve genel olmayan.

Public Class First
End Class

Public Class Second
    Inherits First
End Class

Public Delegate Function SampleDelegate(ByVal a As Second) As First
Public Delegate Function SampleGenericDelegate(Of A, R)(ByVal a As A) As R

veya SampleDelegate(Of A, R) türlerinin SampleDelegate temsilcilerini oluşturduğunuzda, aşağıdaki yöntemlerden herhangi birini bu temsilcilere atayabilirsiniz.

' Matching signature.
Public Shared Function ASecondRFirst(
    ByVal second As Second) As First
    Return New First()
End Function

' The return type is more derived.
Public Shared Function ASecondRSecond(
    ByVal second As Second) As Second
    Return New Second()
End Function

' The argument type is less derived.
Public Shared Function AFirstRFirst(
    ByVal first As First) As First
    Return New First()
End Function

' The return type is more derived
' and the argument type is less derived.
Public Shared Function AFirstRSecond(
    ByVal first As First) As Second
    Return New Second()
End Function

Aşağıdaki kod örneği, yöntem imzası ile temsilci türü arasındaki örtük dönüştürmeyi gösterir.

' Assigning a method with a matching signature
' to a non-generic delegate. No conversion is necessary.
Dim dNonGeneric As SampleDelegate = AddressOf ASecondRFirst
' Assigning a method with a more derived return type
' and less derived argument type to a non-generic delegate.
' The implicit conversion is used.
Dim dNonGenericConversion As SampleDelegate = AddressOf AFirstRSecond

' Assigning a method with a matching signature to a generic delegate.
' No conversion is necessary.
Dim dGeneric As SampleGenericDelegate(Of Second, First) = AddressOf ASecondRFirst
' Assigning a method with a more derived return type
' and less derived argument type to a generic delegate.
' The implicit conversion is used.
Dim dGenericConversion As SampleGenericDelegate(Of Second, First) = AddressOf AFirstRSecond

Daha fazla örnek için bkz. Temsilcilerde Varyansı Kullanma (Visual Basic) ve Func ve Eylem Genel Temsilcileri için Varyansı Kullanma (Visual Basic).

Genel Tür Parametrelerinde Varyans

.NET Framework 4 ve sonraki sürümlerde, genel tür parametreleri tarafından belirtilen farklı türlere sahip genel temsilcilerin, türlerin varyansın gerektirdiği şekilde birbirlerinden devralınması durumunda birbirine atanabilmesi için, temsilciler arasında örtük dönüştürmeyi etkinleştirebilirsiniz.

Örtük dönüştürmeyi etkinleştirmek için, veya out anahtar sözcüğünü kullanarak in bir temsilcideki genel parametreleri birlikte değişken veya değişken karşıtı olarak açıkça bildirmeniz gerekir.

Aşağıdaki kod örneği, birlikte değişken genel tür parametresine sahip bir temsilciyi nasıl oluşturabileceğinizi gösterir.

' Type T is declared covariant by using the out keyword.
Public Delegate Function SampleGenericDelegate(Of Out T)() As T
Sub Test()
    Dim dString As SampleGenericDelegate(Of String) = Function() " "
    ' You can assign delegates to each other,
    ' because the type T is declared covariant.
    Dim dObject As SampleGenericDelegate(Of Object) = dString
End Sub

Yöntem imzalarını temsilci türleriyle eşleştirmek için yalnızca varyans desteği kullanıyorsanız ve ve out anahtar sözcüklerini kullanmıyorsanızin, bazen özdeş lambda ifadeleri veya yöntemleriyle temsilci örneği oluşturabileceğinizi, ancak bir temsilciyi diğerine atayamayacağınızı fark edebilirsiniz.

Aşağıdaki kod örneğinde, SampleGenericDelegate(Of String) devralınan Objectolmasına rağmen String açıkça 'a SampleGenericDelegate(Of Object)dönüştürülemez. Genel parametreyi T anahtar sözcüğüyle out işaretleyerek bu sorunu çözebilirsiniz.

Public Delegate Function SampleGenericDelegate(Of T)() As T
Sub Test()
    Dim dString As SampleGenericDelegate(Of String) = Function() " "

    ' You can assign the dObject delegate
    ' to the same lambda expression as dString delegate
    ' because of the variance support for
    ' matching method signatures with delegate types.
    Dim dObject As SampleGenericDelegate(Of Object) = Function() " "

    ' The following statement generates a compiler error
    ' because the generic type T is not marked as covariant.
    ' Dim dObject As SampleGenericDelegate(Of Object) = dString

End Sub

.NET Framework'te Değişken Türü Parametreleri Olan Genel Temsilciler

.NET Framework 4, var olan çeşitli genel temsilcilerde genel tür parametreleri için varyans desteği sunar:

Daha fazla bilgi ve örnek için bkz. Func ve Eylem Genel Temsilcileri için Varyansı Kullanma (Visual Basic).

Genel Temsilcilerde Değişken Türü Parametrelerini Bildirme

Genel temsilcinin ortak değişken veya değişken karşıtı genel tür parametreleri varsa, değişken genel temsilci olarak anılabilir.

Anahtar sözcüğünü kullanarak genel bir temsilcide ortak değişken bir genel tür parametresi bildirebilirsiniz out . Kovarant türü, yöntem bağımsız değişkenlerinin türü olarak değil, yalnızca yöntem dönüş türü olarak kullanılabilir. Aşağıdaki kod örneği, birlikte değişken bir genel temsilcinin nasıl bildir yapılacağını gösterir.

Public Delegate Function DCovariant(Of Out R)() As R

Anahtar sözcüğünü kullanarak genel bir temsilcide genel tür parametresi contravariant bildirebilirsiniz in . Değişken karşıtı tür, yöntem dönüş türü olarak değil, yalnızca yöntem bağımsız değişkenlerinin türü olarak kullanılabilir. Aşağıdaki kod örneği, değişken karşıtı genel temsilcinin nasıl bildir yapılacağını gösterir.

Public Delegate Sub DContravariant(Of In A)(ByVal a As A)

Önemli

ByRef Visual Basic'teki parametreler değişken olarak işaretlenemez.

Aynı temsilcide hem varyansı hem de kovaryansı desteklemek, ancak farklı tür parametreleri için de mümkündür. Bu, aşağıdaki örnekte gösterilir.

Public Delegate Function DVariant(Of In A, Out R)(ByVal a As A) As R

Değişken Genel Temsilcilerini Örnekleme ve Çağırma

Değişken temsilcilerin örneğini oluşturup çağırdığınız gibi değişken temsilcileri de başlatabilir ve çağırabilirsiniz. Aşağıdaki örnekte temsilcinin örneği bir lambda ifadesiyle oluşturulur.

Dim dvariant As DVariant(Of String, String) = Function(str) str + " "
dvariant("test")

Değişken Genel Temsilcilerini Birleştirme

Değişken temsilcileri birleştirmemelisiniz. Combine yöntemi değişken temsilci dönüştürmeyi desteklemez ve temsilcilerin tam olarak aynı türde olmasını bekler. Bu, aşağıdaki kod örneğinde gösterildiği gibi yöntemini (C# ve Visual Basic'te Combine ) veya işlecini (C#'de) kullanarak + temsilcileri birleştirdiğinizde bir çalışma zamanı özel duruma yol açabilir.

Dim actObj As Action(Of Object) = Sub(x) Console.WriteLine("object: {0}", x)
Dim actStr As Action(Of String) = Sub(x) Console.WriteLine("string: {0}", x)

' The following statement throws an exception at run time.
' Dim actCombine = [Delegate].Combine(actStr, actObj)

Değer ve Başvuru Türleri için Genel Tür Parametrelerinde Varyans

Genel tür parametreleri için varyans yalnızca başvuru türleri için desteklenir. Örneğin, DVariant(Of Int)tamsayı bir değer türü olduğundan örtük olarak veya DVariant(Of Long)olarak dönüştürülemezDVariant(Of Object).

Aşağıdaki örnek, genel tür parametrelerindeki varyansın değer türleri için desteklenmediğini gösterir.

' The type T is covariant.
Public Delegate Function DVariant(Of Out T)() As T
' The type T is invariant.
Public Delegate Function DInvariant(Of T)() As T
Sub Test()
    Dim i As Integer = 0
    Dim dInt As DInvariant(Of Integer) = Function() i
    Dim dVariantInt As DVariant(Of Integer) = Function() i

    ' All of the following statements generate a compiler error
    ' because type variance in generic parameters is not supported
    ' for value types, even if generic type parameters are declared variant.
    ' Dim dObject As DInvariant(Of Object) = dInt
    ' Dim dLong As DInvariant(Of Long) = dInt
    ' Dim dVariantObject As DInvariant(Of Object) = dInt
    ' Dim dVariantLong As DInvariant(Of Long) = dInt
End Sub

Visual Basic'te Gevşek Temsilci Dönüştürme

Gevşek temsilci dönüştürme, yöntem imzalarını temsilci türleriyle eşleştirme konusunda daha fazla esneklik sağlar. Örneğin, bir temsilciye yöntem atadığınızda parametre belirtimlerini atlamanıza ve işlev dönüş değerlerini atlamanıza olanak tanır. Daha fazla bilgi için bkz . Gevşek Temsilci Dönüştürme.

Ayrıca bkz.