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 başvuru dönüştürmeyi etkinleştirir. 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 tür dizisine örtük olarak dönüştürmeyi sağlar. Ancak bu işlem, aşağıdaki kod örneğinde gösterildiği gibi güvenli tür değildir.

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

Yöntem grupları için kovaryans ve kontravaryans desteği, temsilci türleriyle eşleşen yöntem imzalarına 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 (contravariance) 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 kontravaryans 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ümlerde C# genel arabirimlerde ve temsilcilerde kovaryans ve kontravaryansı 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 başvuru 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 bkz . Temsilcilerde Değişken Genel Arabirimleri (C#) ve Varyans Oluşturma (C#).

Başlık Açıklama
Genel Arabirimlerde Varyans (C#) Genel arabirimlerde kovaryans ve kontravaryansı açıklar ve .NET'teki değişken genel arabirimlerin bir 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#) ve IComparable<T> arabirimlerindeki kovaryans ve kontravaryans desteğinin IEnumerable<T> kodu yeniden kullanmanıza nasıl yardımcı olabileceğini gösterir.
Temsilcilerdeki Fark (C#) Genel ve genel olmayan temsilcilerde kovaryans ve kontravaryansı açıklar ve .NET'teki değişken genel temsilcilerin bir listesini sağlar.
Temsilcilerde Varyans Kullanma (C#) Yöntem imzalarını temsilci türleriyle eşleştirmek için genel olmayan temsilcilerde kovaryans ve değişken karşıtı desteğin nasıl kullanılacağını gösterir.
Func ve Eylem Genel Temsilcileri için Varyans Kullanma (C#) ve Action temsilcilerindeki kovaryans ve kontravaryans desteğinin Func kodu yeniden kullanmanıza nasıl yardımcı olabileceğini gösterir.