SORU
29 EKİM 2008, ÇARŞAMBA


Nasıl Kovaryans & Contra-varyans Genel olarak Uygulanan C# 4.0?

2008 ama C# 4.0 kovaryans ve contra-varyans Genel destek için ilan edilen bazı haberler duydum PDC okumadım. List<object> tayin etmek, List<string> ' dır. Bu nasıl olabilir?

Jon Skeet kitabındaC# Derinlemesineaçıkladı neden C# jenerik ve contra-varyans kovaryans desteklemiyor. Özellikle güvenli kod yazmak için. Şimdi, C# 4.0 onlara destek için değiştirdi. Kaos başlardı?

Herkes C# 4.0 ile ilgili detayları biraz açıklama yapar biliyor musun?

CEVAP
29 EKİM 2008, ÇARŞAMBA


Varyans tek bir desteklenecektirgüvenliyol - aslında, CLR zaten sahip olduğu yeteneklerini kullanarak. List<Fruit> a (veya her neyse) hala işe yaramaz olarak List<Banana> kullanmaya çalışırken kitapta verdiğim örnekler çok ama birkaç diğer senaryolar.

Öncelikle, sadece arayüzleri ve delegeler için destek olacak.

İkinci olarak, arayüzü/temsilci yazarı in (contravariance) veya out (kovaryans) türü parametreleri süslemek için gerektirir. Bunun en bariz örneği sadece sana değerleri "" - eklemeye izin vermez yenilerini. çıkar sağlayan IEnumerable<T> IEnumerable<out T> olacak. Bu tür güvenliği hiç zarar vermez, ama sağlar bir yöntem örneği için IEnumerable<object> dönüş için ilan IEnumerable<string> bir dönüş.

Contravariance zor arayüzleri kullanmak için somut örnekler vermek, ama bir temsilci ile çok kolay. Sadece T bir parametre alan bir yöntemi temsil eder Action<T> - düşünün. O-cekti var olmak iyi yapabilmek için dönüştürmek sorunsuz bir şekilde kullanın Action<object> Action<string> - herhangi bir yöntemi alır bir object parametre olacak iyi zaman ile sunulan string yerine. Tabii ki, C# 2 zaten var kovaryans ve contravariance delegeleri için bir ölçüde, ama üzerinden bir dönüşüm, gerçek bir temsilci türü için başka bir (oluşturma Yeni bir örnek) - bakın P141-144 örnek. # 4 Bu daha genel ve (sanırım) yapacak C dönüşüm için yeni bir örneğini oluşturmaktan kaçının. (Referans bir dönüşüm yerine olacak.)

Bu temizler umarım onu biraz izin verin bana, eğer mantıklı değil mi!

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • David Wills

    David Wills

    31 Aralık 2007
  • Dogbert files

    Dogbert file

    12 Ocak 2012
  • Max Lee

    Max Lee

    18 AĞUSTOS 2006