soru sola, onu alsa bile. C# içinde jenerik kullanmanın bir yolu var, böylece bu işe yarayabilir mi? Onları soyut sınıflar haline getirirsem, iyi görünüyor, ancak bunlara arayüz olarak ihtiyacım var.C# miras İki arayüzleri var
cevap
Aradığınız özellik jenerik Varyans (Kovaryans ve contravariance) olarak anılacaktır ne olduğunu. Bu, .net framework 4'ten başlayarak bunun için sınırlı bir destek var. İşte ilginç bir yazı: How is Generic Covariance & Contra-variance Implemented in C# 4.0?
Ve işte MSDN entry on Covariance and Contravariance in Generics.
msdn bağlantı için teşekkürler, yardımcı oldu, ben başka bir şekilde benim sorunumu çözmek zorunda gibi görünüyor –
Bir kovaryans sorunu yok. Eğer yapabilirsek:
Dictionary<int, A> dict = new Dictionary<int, B>();
Bu dict Tip A'nın bir nesne koymak için bir derleyici hatası olmadan mümkün olacaktır.
Sorun şu şekilde görünüyor: Dictionary<int, A>
ancak gerçekten Dictionary<int, B>()
yazıyor (bu nedenle A tipi bir nesne yerleştirme, geçersiz bir yayınlama nedeniyle bir çalışma zamanı hatası veriyordu), bu yüzden denemeye bile izin verilmemelidir. yapamayacağınız, bu yüzden de dict Tip A'nın bir nesne koyun:
Dictionary<int, A> dict = new Dictionary<int, B>();
bir çalışma zamanı hata yapmaktan koruyor.
siz bu konuda Eric Lippert blog kontrol etmek istiyorum: http://blogs.msdn.com/b/ericlippert/
Söylemesi en sevdiği konulardan biri, bu yüzden oldukça kapsamlı bu.
blog bağlantısı için teşekkürler!Bu mantıklıdır –
Ben bunun arkasındaki düşünce kusurlu görünüyor çünkü soruna bir yol bulmak için gidiyoruz sanmıyorum. Bunu açıklamak için, başka bir arayüze yapalım: Ben denemek zaman ne sonra meydana gelir
Dictionary<int, A> dict = new Dictionary<int, B>();
:
Şimdipublic interface C : A
{
void cMethod();
}
, kodunuzu kullanmasına izin?
C c = new ClassThatImplementsC();
dict.Add(1, c);
çok, çok daha fazla ayrıntı için
Eric Lippert's Covariance and Contravarience FAQ bir göz atın.
Bu aslında Alexandra'nın SSS'sidir; Sadece düzenledim. –
bu da çok anlamlı, teşekkürler –
- 1. C++ arayüzleri nasıl uygulanır?
- 2. C++ kütüphanelerine C arayüzleri örnekleri?
- 3. C# getters/yapılar ve arayüzleri
- 4. Seçici miras C++
- 5. yineleme arayüzleri
- 6. C++ şablon sınıfı ve miras
- 7. C++ Baskınlık uyarısı yoluyla miras alın
- 8. bir parametre için birden arayüzleri belirtme
- 9. çözülebilir - miras
- 10. birden miras
- 11. Harita miras
- 12. Djinni: arayüzleri tüm ortamlarda uygulanabilir olarak tanımlayabilir miyim?
- 13. Miras sınıfını, temel sınıf
- 14. C++ Birden çok farklı dönüş türüne sahip arabirimlerden miras alınır?
- 15. acemi miras sorumlusu
- 16. İki unsurları var id
- 17. İki tablo var
- 18. Böyle iki diziler var
- 19. İki tablo var C# Modeli Sql nesneden özellik
- 20. karşılaştırın iki ArrayList İki Dizi Listeleri var
- 21. i iki sütun ile iki tablo var
- 22. Miras veya kompozisyon kullanmalı mıyım?
- 23. Miras bellek depolaması olan nesneler
- 24. JSF 2 kompozit bileşenlerinde miras olarak bir şey var mı?
- 25. C# İki SortedLists (Birleştirme?)
- 26. sarılmış tipin örneğini "Miras"
- 27. Parametrelere Metaclass Miras
- 28. PostgreSQL miras mı?
- 29. Android 5.0 Lollipop UsbDevice eksik arayüzleri
- 30. İki dosya arasında bir yöntemi bölme C#
Hangi .NET sürümünü kullanıyorsunuz? – Dinah
@Dinah: Çerçeve versiyonu neden bu durumda bir fark yaratıyor? – LukeH
@LukeH: Çünkü .NET 4.0, bunu ele alabilecek Kovaryans ve Kontra-varyansa sahiptir. dmurph 4.0 olmasına rağmen bu sorunu yaşıyorsa, sorun farklı olurdu daha konu öncesi 4.0 – Dinah