Wie ist eine Allgemeine Kovarianz & Contra-Varianz Implementiert in C# 4.0?
Ich nicht an PDC 2008, aber ich habe gehört, einige Neuigkeiten, die C# 4.0 ist angekündigt, zur Unterstützung der Generischen Kovarianz-und contra-Varianz. Das ist List<string>
zugeordnet werden können List<object>
. Wie konnte das sein?
Jon Skeet Buch C# in der Tiefe, es wird erklärt, warum C# - generics nicht unterstützt Kovarianz-und contra-Varianz. Es ist vor allem für das schreiben von sicherem code. Nun, C# 4.0 geändert, um Sie zu unterstützen. Würde es bringen chaos?
Jemand die details wissen über C# 4.0 geben kann, eine Erklärung?
Hier ist ein guter Artikel über die kommende Kovarianz-und contra-Varianz-Implementierungen auf Delegaten und Schnittstellen in C# 4.0: LINQ Farm: Kovarianz und Kontravarianz in C# 4.0
Anders Noråse erklärt in C# 4.0 - Kovarianz-und contra-Varianz das Konzept und zeigt, dass es bereits heute unterstützt in IL seit .NET 2.0.
Anders Noråse erklärt in C# 4.0 - Kovarianz-und contra-Varianz das Konzept und zeigt, dass es bereits heute unterstützt in IL seit .NET 2.0.
InformationsquelleAutor Morgan Cheng | 2008-10-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Varianz wird nur unterstützt, in einer sicher Weise - in der Tat, mit den Fähigkeiten, die der CLR-bereits hat. Also die Beispiele, die ich geben in dem Buch der Versuch, eine
List<Banana>
alsList<Fruit>
(oder was auch immer es war) immer noch nicht funktionieren, aber ein paar andere Szenarien.Erstens, es werden nur unterstützt für Schnittstellen und Delegaten.
Zweitens, Bedarf es der Autor der Schnittstelle/delegieren dekorieren Sie den Typ der Parameter als
in
(Kontravarianz) oderout
(Kovarianz). Das offensichtlichste Beispiel ist dieIEnumerable<T>
die nur immer können Sie die Werte "out" - es lässt Sie nicht neue hinzufügen. Das wirdIEnumerable<out T>
. Das tut nicht weh, geben Sie Sicherheit, sondern ermöglicht Ihnen die Rückkehr einIEnumerable<string>
von einer Methode deklariert zurückIEnumerable<object>
zum Beispiel.Kontravarianz ist härter zu geben, konkrete Beispiele für die Verwendung von Schnittstellen, aber es ist einfach, mit einem Delegaten. Betrachten
Action<T>
- dass gerade repräsentiert eine Methode, die eineT
parameter. Es wäre schön, in der Lage zu konvertieren nahtlos verwenden Sie einAction<object>
alsAction<string>
- jede Methode nimmt einobject
parameter wird in Ordnung sein, wenn es präsentiert sich mit einerstring
statt. Natürlich, C# 2 hat bereits Kovarianz und Kontravarianz der Delegierten zu einem gewissen Grad jedoch über eine tatsächliche Konvertierung von einer delegate-Typ auf einen anderen (erstellen einer neuen Instanz) - siehe P141-144 Beispiele. C# 4 wird diese mehr generische und (ich glaube) vermeiden Sie die Erstellung einer neuen Instanz für die Konvertierung. (Es wird ein Referenz-Konvertierung statt.)Hoffe, das klärt es ein bisschen - lassen Sie es mich bitte wissen, ob es nicht sinnvoll ist!
Morgan: Das ist sicherlich mein Verständnis, ja.
doch wieder einer deiner Antworten hier auf, SO hat sofort geholfen, mich zu verbessern einige code. Danke!!!
Ja, ich bin mir dessen bewusst, dass. Daher das "noch nicht arbeiten" im gleichen Satz. (Und ich bin mir bewusst, dass die Gründe auch.)
Ist es korrekt, dass "Sie nur eine
List<Banana>
alsIList<Fruit>
" @Ark-kun gesagt hat? Wenn ja, wie ist das möglich, obwohl die Typ-parameter desIList<T>
- Schnittstelle ist nicht definiert als kovariante (keineout T
, sondern einfachT
).InformationsquelleAutor Jon Skeet
Nicht, dass Jon noch nicht abgedeckt, aber hier sind einige links zu blogs und videos von Eric Lippert. Er macht einen schönen job zu erklären, mit Beispielen.
https://blogs.msdn.microsoft.com/ericlippert/2007/10/16/covariance-and-contravariance-in-c-part-one/
Den videos:
https://www.youtube.com/watch?v=3MQDrKbzvqU
https://www.youtube.com/watch?v=XRIadQaBYlI
https://www.youtube.com/watch?v=St9d2EDZfrg
InformationsquelleAutor kemiller2002