SORU
15 Temmuz 2011, Cuma


Fark arasındaki kovaryans ve upcasting

Kovaryans ve upcasting, arasındaki fark nedir daha doğrusu, neden farklı isimler verilir?

Aşağıdaki örnek olarak gördüm'': . upcasting

string s = "hello";
object o = s;  //upcast to 'string' to 'object'

Aşağıdaki aradım görmüş ise,'': . kovaryans

string[] s = new string[100];
object[] o = s;

IEnumerable<string> ies = new List<string>();
IEnumerable<object> ieo = ies;

Şimdi, benim eğitimsiz göz için, kovaryans upcasting aynı, koleksiyon döküm başvurduğu dışında gibi görünüyor. (Benzer bir açıklama yapılabilir ile ilgili contravariance ve downcasting).

Gerçekten bu kadar basit mi?

CEVAP
15 Temmuz 2011, Cuma


Şimdi, benim eğitimsiz göz için, kovaryans upcasting aynı, koleksiyon döküm başvurduğu dışında gibi görünüyor. (Benzer bir açıklama yapılabilir ile ilgili contravariance ve downcasting).

Gerçekten bu kadar basit mi?

Kovaryans ilgili sence neden görebilirsiniz, ancak hakkında upcasting değil.

Kovaryans çok basit aşağıdaki fikir hakkında. Hadi 6* *tür derivedSequence bir değişken olduğunu varsayalım. Hadi 8* *türü baseSequence bir değişken olduğunu varsayalım. Burada, Derived Base türetir. Sonra, kovaryans, aşağıdaki yasal bir görev, ve örtülü referans bir dönüşüm oluşur:

baseSequence = derivedSequence;

Bu upcasting unutmayın. IEnumerable<Derived> IEnumerable<Base> türeyen durum böyle değil. Bunun yerine, değişken değeri atamak için izin veren kovaryans olduğu değişken baseSequence 14*. Fikri olan değişken tipi Base atanabilir nesneleri tipi Derived beri IEnumerable<T> kovaryant kendi parametre, nesne türü IEnumerable<Derived> atanabilen değişken tipi IEnumerable<Base>.

Elbette, henüz çok kovaryans ne olduğunu açıklayamadım. Genel olarak, kovaryans aşağıdaki basit fikirdir. Diyelim ki bir eşleme F tip tip (vereceğim belirtmek bu eşleme F<T>; verilen bir tür T görüntüsü altında eşleme F F<T>.) Bakalım bu eşleştirme çok özel aşağıdaki özelliği olduğunu söylüyor:

X Y, atama ile uyumlu ise F<X> F<Y> atama ile de uyumludur.

Bu durumda, F parametre T kovaryant. (Burada, söylemek "A ataması ile uyumlu B" A B referans tipleri anlamına gelen örnekleri B saklanabilir değişken tipi A.)

Bizim durumumuzda, IEnumerable<T> Derived Base türetilir C IEnumerable<Base> 39 *örneklerden# 4.0, örtülü referans bir dönüşüm içinde. Atama uyumluluk yönünde korunur ve bu IEnumerable<T> tür parametresi kovaryant bu yüzden diyoruz ki.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • GavinMichaelBooth

    GavinMichael

    26 AĞUSTOS 2006
  • KliptOut KwazeeKilla

    KliptOut Kwa

    24 ŞUBAT 2010
  • Ryan Billy

    Ryan Billy

    30 EKİM 2006