Aracılığıyla paylaş


Temsilcilerde Varyans (C# ve Visual Basic)

.net Framework 3.5 ve Visual Studio 2008 farkı destek yöntem imzaları C# ve Visual Basic içinde tüm temsilci temsilci türüyle eşleştirmek için kullanılmaya başlandı.Yani atayabileceğiniz yalnızca imzalar eşleşen yöntemleri, aynı zamanda daha fazla türetilen türler (Kovaryans) veya, temsilci türü tarafından belirtilenden daha az türetilen türler (contravariance) sahip parametreleri kabul döndüren yöntemler temsilcisini seçer.Hem genel hem de genel olmayan temsilcileri de buna dahildir.

Örneğin, aşağıdaki kod iki sınıf ve iki temsilci olan 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
public class First { }
public class Second : First { }
public delegate First SampleDelegate(Second a);
public delegate R SampleGenericDelegate<A, R>(A a);

Temsilciler, oluşturduğunuzda, SampleDelegate veya SampleGenericDelegate<A, R> (SampleDelegate(Of A, R) Visual Basic) türlerini atayabilirsiniz aşağıdaki yöntemlerden herhangi birini Bu temsilciler.

' 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
// Matching signature. 
public static First ASecondRFirst(Second first)
{ return new First(); }

// The return type is more derived. 
public static Second ASecondRSecond(Second second)
{ return new Second(); }

// The argument type is less derived. 
public static First AFirstRFirst(First first)
{ return new First(); }

// The return type is more derived  
// and the argument type is less derived. 
public static Second AFirstRSecond(First first)
{ return new Second(); }

Aşağıdaki kod örneği, yöntem imzası ve temsilci türü arasında örtülü Dönüşüm göstermektedir.

' 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
// Assigning a method with a matching signature  
// to a non-generic delegate. No conversion is necessary.
SampleDelegate dNonGeneric = 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.
SampleDelegate dNonGenericConversion = AFirstRSecond;

// Assigning a method with a matching signature to a generic delegate. 
// No conversion is necessary.
SampleGenericDelegate<Second, First> dGeneric = ASecondRFirst;
// Assigning a method with a more derived return type  
// and less derived argument type to a generic delegate. 
// The implicit conversion is used.
SampleGenericDelegate<Second, First> dGenericConversion = AFirstRSecond;

Daha fazla örnek için bkz: Temsilcilerde Varyans Kullanma (C# ve Visual Basic) ve İşlev ve Eylem Genel Temsilcileri için Varyans Kullanma (C# ve Visual Basic).

Genel tür parametreleri varyans

.net Framework 4 türleri birbirinden farkı gerektirdiği gibi devralınır, genel türde parametre tarafından belirtilen farklı türlerine sahip genel Temsilciler birbirleriyle atanabilir böylece Temsilciler arasında örtülü Dönüşüm etkinleştirebilirsiniz.

Örtük dönüştürme etkinleştirmek için açıkça bir temsilci olarak değişkenle birlikte genel parametrelerde bildirmeniz gerekir ya da karşıtı kullanarak in veya out anahtar sözcüğü.

Aşağıdaki kod örneği, bir değişkenle birlikte genel tür parametresi olan bir temsilci nasıl oluşturacağınız gösterilir.

' 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
// Type T is declared covariant by using the out keyword. 
public delegate T SampleGenericDelegate <out T>();

public static void Test()
{
    SampleGenericDelegate <String> dString = () => " ";

    // You can assign delegates to each other, 
    // because the type T is declared covariant.
    SampleGenericDelegate <Object> dObject = dString;           
}

Tek farkı destek eşleşecek şekilde kullanırsanız, yöntem imzaları ile temsilci türleri ve kullanma in ve out anahtar sözcükleri, size bulmak bazen aynı lambda ifadeleri ya da yöntemler temsilcilerle örneğini oluşturabilir, ancak başka bir temsilci atayamazsınız.

Aşağıdaki kod örneği, SampleGenericDelegate<String> açıkça dönüştürülemez SampleGenericDelegate<Object> (SampleGenericDelegate(Of String) için SampleGenericDelegate(Of Object) Visual Basic) olsa da, String devralan Object.Genel parametre olarak işaretlemek için bu sorunu gidermek T ile out anahtar sözcüğü.

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
public delegate T SampleGenericDelegate<T>();

public static void Test()
{
    SampleGenericDelegate<String> dString = () => " ";

    // 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.
    SampleGenericDelegate<Object> dObject = () => " ";

    // The following statement generates a compiler error 
    // because the generic type T is not marked as covariant. 
    // SampleGenericDelegate <Object> dObject = dString;



}

Değişken olan genel Temsilciler parametreleri yazın.net Framework

.net Framework 4 farkı birkaç varolan genel Temsilciler genel tür parametreleri desteği sunar:

Daha fazla bilgi ve örnekler için bkz, İşlev ve Eylem Genel Temsilcileri için Varyans Kullanma (C# ve Visual Basic).

Genel Temsilciler parametrelerinde VARIANT türü bildirmek

Genel temsilcisi değişkenle birlikte veya değişken karşıtı genel türde parametreler onu da adlandırılır olarak varsa bir değişken genel temsilci.

Genel bir tür parametresiyle genel temsilcisi değişkenle birlikte kullanarak bildirebilirsiniz out anahtar sözcüğü.Değişkenle birlikte türü bir tür yöntem bağımsız değişkenleri değil de, yalnızca bir yöntemin dönüş türü olarak kullanılır.Aşağıdaki kod örneği, değişkenle birlikte genel bir temsilci bildirmek gösterilmiştir.

Public Delegate Function DCovariant(Of Out R)() As R
public delegate R DCovariant<out R>();

Genel tür parametresi karşıtı genel temsilcisi olarak kullanarak bildirebilirsiniz in anahtar sözcüğü.Karşıtı türü, bir yöntemin dönüş türü değil de, yalnızca bir tür yöntem bağımsız değişkenleri olarak kullanılabilir.Aşağıdaki kod örneği, karşıtı Soysal temsilcinin bildirimini gösterilmiştir.

Public Delegate Sub DContravariant(Of In A)(ByVal a As A)
public delegate void DContravariant<in A>(A a);
Önemli notÖnemli

ByRefVisual Basic'te parametreleri ve ref ve out C# [NULL]'taki parametreleri ve değişken işaretlenemez.

Aynı temsilci, ancak farklı tür parametreleri için varyans ve Kovaryans desteklemek 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
public delegate R DVariant<in A, out R>(A a);

Örnekleme ve değişken genel Temsilciler çağırma

Örneğini oluşturabilir ve yalnızca örneğini oluşturabilir ve sabit Temsilciler çağırmak gibi değişken Temsilciler çağırmak.Aşağıdaki örnekte, temsilci lambda ifade tarafından başlatılmış.

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

Birleşen değişken genel Temsilciler

Varyant Temsilciler birleştirmelisiniz değil.Combine Yöntemi varyant temsilci dönüşümü desteklemiyor ve tam olarak aynı türde olması için temsilcilerin bekler.Ya da kullanarak Temsilciler birleştirdiğinizde bu bir çalışma zamanı özel durumuna neden olabilir Combine yönteminde (C# ve Visual Basic) veya kullanarak + operator (C#), aşağıdaki kod örneğinde gösterildiği gibi.

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)
Action<object> actObj = x => Console.WriteLine("object: {0}", x);
Action<string> actStr = x => Console.WriteLine("string: {0}", x);
// All of the following statements throw exceptions at run time. 
// Action<string> actCombine = actStr + actObj; 
// actStr += actObj; 
// Delegate.Combine(actStr, actObj);

Genel tür parametreleri varyans değeri ve baþvuru türleri

Genel tür parametreleri farkı baþvuru türleri için desteklenir.Örneğin, DVariant<int> (DVariant(Of Int) Visual Basic) örtük olarak dönüştürülemez DVariant<Object> veya DVaraint<long> (DVariant(Of Object) veya DVaraint(Of Long) Visual Basic), tamsayı bir değer türü olduğundan.

Bu farkı aşağıdaki örnekte gösterilmiştir genel türde parametreler için değer türleri desteklenmez.

' 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 dVaraintInt 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 dVaraintObject As DInvariant(Of Object) = dInt 
    ' Dim dVaraintLong As DInvariant(Of Long) = dInt 
End Sub
// The type T is covariant. 
public delegate T DVariant<out T>();

// The type T is invariant. 
public delegate T DInvariant<T>();

public static void Test()
{
    int i = 0;
    DInvariant<int> dInt = () => i;
    DVariant<int> dVariantInt = () => 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. 
    // DInvariant<Object> dObject = dInt; 
    // DInvariant<long> dLong = dInt; 
    // DVariant<Object> dVariantObject = dVariantInt; 
    // DVariant<long> dVariantLong = dVariantInt;            
}

Visual Basic'te gevşek temsilci dönüştürme

Visual Basic 2008'de sunulan gevşek temsilci dönüştürme yöntem imzaları temsilci türleri ile eşleşen daha fazla esneklik sağlar.Örneğin, parametre belirtimleri atlamak ve bir temsilciye bir yöntem atadığınızda işlev döndürme değerleri atlarsanız olanak sağlar.Daha fazla bilgi için bkz. Gevşek Temsilci Dönüşümü (Visual Basic).

Ayrıca bkz.

Görevler

Nasıl yapılır: Temsilcileri Birleştirme (Çok Noktaya Yayın Temsilcileri)(C# Programlama Kılavuzu)

Başvuru

İşlev ve Eylem Genel Temsilcileri için Varyans Kullanma (C# ve Visual Basic)

Diğer Kaynaklar

.NET Framework'te Genel Türler