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
Ş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 iseF<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.
Fark arasındaki Kovaryans & Contra-var...
Val arasındaki fark() ve text()...
JavaScript çocuk ve childNodes arasınd...
Bir WordPress kullanmak ebeveyn arasın...
Arasındaki fark @al ve linki CSS...