Aracılığıyla paylaş


Kovaryans ve Kontravaryans (C# ve Visual Basic)

C# ve Visual Basic, Kovaryans ve contravariance örtülü başvuru dönüştürme dizi türleri temsilci türleri ve genel tür bağımsız değişkenleri için etkinleştirin.Kovaryans atama uyumluluğu korur ve contravariance tersine çevirir.

Aşağıdaki kod, atama uyumluluk, Kovaryans ve contravariance arasındaki farkı gösterir.

' Assignment compatibility.  
Dim str As String = "test" 
' An object of a more derived type is assigned to an object of a less derived type.  
Dim obj As Object = str

' Covariance.  
Dim strings As IEnumerable(Of String) = New List(Of String)()
' An object that is instantiated with a more derived type argument  
' is assigned to an object instantiated with a less derived type argument.  
' Assignment compatibility is preserved.  
Dim objects As IEnumerable(Of Object) = strings

' Contravariance.            
' Assume that there is the following method in the class:  
' Shared Sub SetObject(ByVal o As Object) 
' End Sub 
Dim actObject As Action(Of Object) = AddressOf SetObject

' An object that is instantiated with a less derived type argument  
' is assigned to an object instantiated with a more derived type argument.  
' Assignment compatibility is reversed.  
Dim actString As Action(Of String) = actObject
// Assignment compatibility.  
string str = "test";
// An object of a more derived type is assigned to an object of a less derived type.  
object obj = str;

// Covariance. 
IEnumerable<string> strings = new List<string>();
// An object that is instantiated with a more derived type argument  
// is assigned to an object instantiated with a less derived type argument.  
// Assignment compatibility is preserved. 
IEnumerable<object> objects = strings;

// Contravariance.            
// Assume that the following method is in the class:  
// static void SetObject(object o) { } 
Action<object> actObject = SetObject;
// An object that is instantiated with a less derived type argument  
// is assigned to an object instantiated with a more derived type argument.  
// Assignment compatibility is reversed. 
Action<string> actString = actObject;

Kovaryans diziler için daha az türetilen türden bir dizi daha türetilmiş bir tür dizisinin örtük dönüştürme sağlar.Ancak bu işlem türü güvenli, aşağıdaki kod örneğinde gösterildiği gibi değil.

Dim array() As Object = New String(10) {}
' The following statement produces a run-time exception. 
' array(0) = 10
object[] array = new String[10];
// The following statement produces a run-time exception. 
// array[0] = 10;

Temsilci türleri ile eşleşen yöntem imzaları Kovaryans ve contravariance yöntemi grupları desteğini sağlar.Yalnızca imzalar, aynı zamanda daha türetilen türler (Kovaryans) veya temsilci türü tarafından belirtilenden daha az türetilen türler (contravariance) olan parametreler, kabul döndüren yöntemler eşleşen yöntem için temsilci atamak etkinleştirir.Daha fazla bilgi için, bkz. Temsilcilerde Varyans (C# ve Visual Basic) ve Temsilcilerde Varyans Kullanma (C# ve Visual Basic).

Aşağıdaki kod örneği, Kovaryans ve contravariance yöntemi gruplar için destek gösterir.

Shared Function GetObject() As Object 
    Return Nothing 
End Function 

Shared Sub SetObject(ByVal obj As Object)
End Sub 

Shared Function GetString() As String 
    Return "" 
End Function 

Shared Sub SetString(ByVal str As String)

End Sub 

Shared Sub Test()
    ' Covariance. A delegate specifies a return type as object, 
    ' but you can assign a method that returns a string. 
    Dim del As Func(Of Object) = AddressOf GetString

    ' Contravariance. A delegate specifies a parameter type as string, 
    ' but you can assign a method that takes an object. 
    Dim del2 As Action(Of String) = AddressOf SetObject
End Sub
static object GetObject() { return null; }
static void SetObject(object obj) { }

static string GetString() { return ""; }
static void SetString(string str) { }

static void Test()
{
    // Covariance. A delegate specifies a return type as object, 
    // but you can assign a method that returns a string.
    Func<object> del = GetString;

    // Contravariance. A delegate specifies a parameter type as string, 
    // but you can assign a method that takes an object.
    Action<string> del2 = SetObject;
}

.net Framework 4 ve Visual Studio 2010 hem C# ve Visual Basic Kovaryans ve contravariance generic arabirimlerden ve temsilciler destek ve genel tür parametreleri örtük dönüştürme için izin.Daha fazla bilgi için, bkz. Genel Arabirimlerde Varyans (C# ve Visual Basic) ve Temsilcilerde Varyans (C# ve Visual Basic).

Aşağıdaki kod örneği, genel arabirimler için örtülü başvuru dönüşümü gösterir.

Dim strings As IEnumerable(Of String) = New List(Of String)
Dim objects As IEnumerable(Of Object) = strings
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;

Genel arabirim veya temsilci olarak adlandırılan variant genel parametrelerini değişkenle birlikte bildirilir, ya da karşıtı.Hem C# ve Visual Basic kendi temsilcileri ve Varyant arabirimleri oluşturmanıza olanak sağlar.Daha fazla bilgi için, bkz. Değişken Genel Arabirimler Oluşturma (C# ve Visual Basic) ve Temsilcilerde Varyans (C# ve Visual Basic).

İlgili Konular

Başlık

Description

Genel Arabirimlerde Varyans (C# ve Visual Basic)

Kovaryans ve contravariance genel arabirimler içinde açıklanır ve Varyant genel arabirimler listesini sağlar.net Framework.

Değişken Genel Arabirimler Oluşturma (C# ve Visual Basic)

Özel varyant arabirimlerin nasıl oluşturulacağı gösterilmektedir.

Genel Koleksiyonlar için Arabirimlerde Varyans Kullanma (C# ve Visual Basic)

Nasıl Kovaryans ve contravariance destekler gösterir IEnumerable ve IComparable arabirimleri, kodu yeniden kullanmanıza yardımcı olabilir.

Temsilcilerde Varyans (C# ve Visual Basic)

Kovaryans ve contravariance genel ve genel olmayan temsilcileri de anlatılır ve içinde değişken genel Temsilciler listesini sağlar.net Framework.

Temsilcilerde Varyans Kullanma (C# ve Visual Basic)

Kovaryans ve contravariance destek genel olmayan temsilcileri yöntem imzaları temsilci türleri ile eşleşmesi için nasıl kullanılacağını gösterir.

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

Nasıl Kovaryans ve contravariance destekler gösterir Func ve Action Temsilciler, kod yeniden kullanmanıza yardımcı olabilir.