Aracılığıyla paylaş


Kovaryans ve Kontravaryans (C#)

C# dilinde kovaryans ve kontravaryans, dizi türleri, temsilci türleri ve genel tür bağımsız değişkenleri için örtük referans dönüşümüne olanak tanır. Kovaryans atama uyumluluğunu korur ve değişken karşıtı bunu tersine çevirir.

Aşağıdaki kod, atama uyumluluğu, kovaryans ve değişken karşıtı arasındaki farkı gösterir.

// 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;  

Diziler için kovaryans, daha türetilmiş bir tür dizisini daha az türetilmiş bir diziye örtük olarak dönüştürmeyi sağlar. Ancak aşağıdaki kod örneğinde gösterildiği gibi bu işlem tür güvenli değildir.

object[] array = new String[10];  
// The following statement produces a run-time exception.  
// array[0] = 10;  

Yöntem gruplarına kovaryans ve kontravaryans desteği, delege türleriyle uyumlu yöntem imzalarını eşleştirmeye olanak tanır. 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 atamanızı sağlar. Daha fazla bilgi için bkz. Temsilcilerde Varyans (C#) ve Temsilcilerde Varyansı Kullanma (C#).

Aşağıdaki kod örneği, yöntem grupları için kovaryans ve ters değişken desteğini gösterir.

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 sonraki sürümlerinde C# genel arabirimlerde ve temsilcilerde kovaryans ve karşı değişkenliği destekler ve genel tür parametrelerinin örtük olarak dönüştürülmesini sağlar. Daha fazla bilgi için bkz. Genel Arabirimlerde Varyans (C#) ve Temsilcilerde Varyans (C#).

Aşağıdaki kod örneği, genel arabirimler için örtük referans dönüştürmesini gösterir.

IEnumerable<String> strings = new List<String>();  
IEnumerable<Object> objects = strings;  

Genel parametreleri birlikte değişken veya değişken karşıtı olarak bildirilirse genel arabirim veya temsilci değişken olarak adlandırılır. C# kendi değişken arabirimlerinizi ve temsilcilerinizi oluşturmanıza olanak tanır. Daha fazla bilgi için Değişken Genel Arabirimler Oluşturma (C#) ve Temsilcilerde Varyans (C#) konularına bakın.

Başlık Açıklama
Genel Arabirimlerde Varyans (C#) Genel arabirimlerde kovaryansı ve kontrvaryansı açıklar ve .NET'teki değişken genel arabirimlerin listesini sağlar.
Değişken Genel Arabirimleri Oluşturma (C#) Özel değişken arabirimlerinin nasıl oluşturulacağını gösterir.
Genel Koleksiyonlar için Arabirimlerde Varyans Kullanma (C#) IEnumerable<T> ve IComparable<T> arabirimlerindeki kovaryans ve kontravarans desteğinin, kodu yeniden kullanmanıza nasıl yardımcı olabileceğini gösterir.
Temsilcilerdeki Fark (C#) Genel ve genel olmayan temsilcilerde kovaryans ve ters değişkenlik konularını açıklar ve .NET'teki değişken genel temsilcilerin listesini sağlar.
Temsilcilerde Varyansı Kullanma (C#) Yöntem imzalarını temsilci türleriyle eşleştirmek için genel olmayan temsilcilerde kovaryans ve ters değişken desteğinin nasıl kullanılacağını gösterir.
Func ve Action Genel Temsilciler için Varyans Kullanımı (C#) Func ve Action temsilcilerindeki kovaryans ve kontravaryans desteğinin kodu yeniden kullanmanıza nasıl yardımcı olabileceğini gösterir.