SORU
17 EYLÜL 2012, PAZARTESİ


Neden kovaryans ve contravariance değer türü desteklemez

IEnumerable<T>co-varyantama değer türü, yalnızca başvuru türü desteklemiyor. Aşağıda basit bir kod başarılı bir şekilde derlendi:

IEnumerable<string> strList = new List<string>();
IEnumerable<object> objList = strList;

Ama int string değişen hata derlenmiş alacak:

IEnumerable<int> intList = new List<int>();
IEnumerable<object> objList = intList;

Nedeni MSDN açıklanmıştır:

Farkı yalnızca başvuru türleri için geçerlidir; değişken türü parametresi için bir değer türü belirtirseniz, bu tür parametresi için oluşturulmuş sonuç türü sabit.

Aradım ve bazı sorular nedeni söz bulundudeğer türü ve başvuru türü arasındaki boks. Ama hala boks sebebi çok kafam değil mi?

Birisi kovaryans ve contravariance değer türü desteklemez neden basit ve ayrıntılı bir açıklama ve nasıl lütfenboksbu etkiler?

CEVAP
17 EYLÜL 2012, PAZARTESİ


Temelde, varyans CLR herhangi yapmak değil emin olun zaman geçerlidirtemsili olarak değiştirindeğerleri için. Tüm başvurular aynı görünüyor - bir IEnumerable<string> IEnumerable<object> olmadan herhangi bir değişiklik temsil; yerel kod kendisi gerekmez ne yaptığının farkında olan değerleri, çok uzun gibi altyapı var Garanti Bu kesinlikle geçerli.

Değer türleri için, bu işe yaramazsa - ** 10, IEnumerable<int> bir tedavi için kod sırasını kullanarak bir boks dönüşüm gerçekleştirmek için olup olmadığını bilmek gerekir.

Eric Lippert blog post on representation and identity genel olarak bu konu hakkında daha fazla okumak isteyebilirsiniz.

Eric'in blog yazısı kendimi yeniden okumak Zorunda, en azından kadar . EDİT: ^em>kimlikiki bağlantılı olmakla birlikte temsili olarak. Özellikle:

Bu arayüz kovaryant ve karşıtı dönüşüm ve temsilci türleri hepsi farklı tür bağımsız değişkenleri başvuru türü olmasını gerektirir nedeni budur. Değişken bir referans dönüşüm her zaman kimlik koruma sağlamak için, dönüşüm tür bağımsız değişkenleri içeren tüm da Kimlik Koruma olmalıdır. Tür bağımsız değişkenleri üzerinde önemsiz olmayan tüm dönüşümlerin kimlik koruma sağlamak için en kolay yolu onları referans dönüşüm için sınırlamak için.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Autodesk 3ds Max Learning Channel

    Autodesk 3ds

    23 HAZİRAN 2010
  • Blue Lightning TV

    Blue Lightni

    9 EKİM 2011
  • Tech4Geeks

    Tech4Geeks

    8 Ocak 2012