Birlikte değişkenlik ve Kontravaryans (C#)
C# içinde, birlikte değişkenlik ve kontravaryans dizi türleri, temsilci türleri ve genel tür bağımsız değişkenleri için örtülü başvuru dönüştürmeyi etkinleştirir. Birlikte değişken atama uyumluluğunu korur ve değişkenliği tersine çevirer.
Aşağıdaki kod atama uyumluluğu, birlikte değişkenlik ve değişken değişkenliği 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 birlikte değişkenlik, daha türetilmiş bir türe sahip bir dizinin daha az türetilmiş bir türe sahip bir diziye örtülü olarak dönüşüme olanak sağlar. Ancak bu işlem, aşağıdaki kod örneğinde gösterildiği gibi güvenli değildir.
object[] array = new String[10];
// The following statement produces a run-time exception.
// array[0] = 10;
Yöntem grupları için birlikte değişkenlik ve kontravaryans desteği, temsilci türleriyle yöntem imzalarını eşleştirmeye olanak sağlar. Bu, temsilcilere yalnızca eşleşen imzalara sahip yöntemleri değil, aynı zamanda daha fazla türetilmiş tür (birlikte değişken) veya temsilci türü tarafından belirtilenden daha az türetilmiş türe (kontravaryans) sahip parametreleri kabul eden yöntemler atamaya olanak 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 birlikte değişkenliği ve değişkenlik 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;
}
4.NET Framework ve sonraki sürümlerde C# genel arabirimlerde ve temsilcilerde birlikte değişkenliği ve kontravaryansı destekler ve genel tür parametrelerinin örtülü dönüştürmeye olanak 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ülü başvuru dönüştürmeyi gösterir.
IEnumerable<String> strings = new List<String>();
IEnumerable<Object> objects = strings;
Genel parametreler birlikte değişken veya değişken olarak bildirildi ise genel arabirim veya temsilci varyant olarak çağrılır. C# kendi değişken arabirimlerinizi ve temsilcilerinizi oluşturmanıza olanak sağlar. Daha fazla bilgi için bkz. Temsilcilerde Değişken Genel Arabirimler (C#) ve Varyans Oluşturma (C#).
İlgili Konular
| Başlık | Açıklama |
|---|---|
| Genel Arabirimlerde Varyans (C#) | Genel arabirimlerde birlikte değişkenliği ve kontravaryansı ele almaktadır ve .NET'te değişken genel arabirimlerin bir listesini sağlar. |
| Değişken Genel Arabirimler Oluşturma (C#) | Özel varyant arabirimleri oluşturma hakkında bilgi sağlar. |
| Genel Koleksiyonlar için Arabirimlerde Varyans Kullanma (C#) | ve arabirimleri içinde birlikte değişkenlik ve değişkenlik desteğinin kodu yeniden IEnumerable<T> IComparable<T> kullanmanıza nasıl yardımcı olduğunu gösterir. |
| Temsilcilerde Varyans (C#) | Genel ve genel olmayan temsilcilerde birlikte değişkenliği ve kontravaryansı tartışan ve .NET'te değişken genel temsilciler listesi sağlar. |
| Temsilcilerde Varyans Kullanma (C#) | Yöntem imzalarını temsilci türleriyle eşlerken genel olmayan temsilcilerde birlikte değişkenlik ve değişkenlik desteğini kullanmayı gösterir. |
| Func ve Action Genel Temsilcileri için Varyans Kullanma (C#) | ve temsilcilerinde birlikte değişkenlik ve kontravaryans desteğinin Func Action kodu yeniden kullanmanıza nasıl yardımcı olduğunu gösterir. |