Frage

ich doch nicht zu PDC 2008, aber ich hörte einige Nachrichten, die C # 4.0 angekündigt Allgemeine Kovarianz und Kontravarianz zu unterstützen. Das heißt, List<string> List<object> zugeordnet werden. Wie kann das sein?

In Jon Skeet Buch C # in Depth wird erläutert, warum C # Generika unterstützen keine Kovarianz und Kontravarianz. Es ist vor allem für den sicheren Code zu schreiben. Nun, 4.0 C # geändert, sie zu unterstützen. Wäre es Chaos bringen?

Weiß jemand, die Details über C # 4.0 kann eine Erklärung geben?

War es hilfreich?

Lösung

Variance wird nur in einer sicher Art und Weise unterstützt werden - in der Tat, die Fähigkeiten mit, dass die CLR bereits. So sind die Beispiele, die ich geben in dem Buch versucht, eine List<Banana> als List<Fruit> zu verwenden (oder was auch immer es war) immer noch nicht funktionieren - aber einige andere Szenarien

.

Zum einen wird es nur für Schnittstellen und Delegierten unterstützt werden.

Zum anderen bedarf es der Autor der Schnittstelle / Delegierten die Typparameter als in (für Kontra) oder out (für Kovarianz) zu dekorieren. Das offensichtlichste Beispiel ist IEnumerable<T> die immer nur können Sie Werte „out“ davon nehmen - es ist nicht neue hinzugefügt hat lassen. Das wird sich IEnumerable<out T>. Das bedeutet nicht, Typsicherheit überhaupt verletzt, aber können Sie ein IEnumerable<string> von einer Methode zurückgeben erklärt IEnumerable<object> zum Beispiel zurückzukehren.

Kontra ist härter konkrete Beispiele zu geben für Schnittstellen, aber es ist mit einem Delegierten einfach. Betrachten Action<T> - dass nur eine Methode darstellt, die einen T Parameter annimmt. Es wäre schön, die Lage sein, nahtlos eine Action<object> als Action<string> verwenden zu konvertieren - jede Methode, die ein object Parameter nimmt fein sein wird, wenn es stattdessen mit einer string präsentiert wird. Natürlich, 2 C # hat bereits Kovarianz und Kontra der Delegierten zu einem gewissen Grad, aber über eine tatsächliche Umwandlung von einem Delegierten Typ in einen anderen (Erstellen einer neuen Instanz) - siehe P141-144 für Beispiele. C # 4 machen diese allgemeineren und (glaube ich) wird vermieden, für die Umwandlung eine neue Instanz zu schaffen. (Es wird stattdessen eine Referenz Umwandlung sein.)

Hope this es ein wenig aufräumt - lassen Sie es mich wissen, ob es nicht sinnvoll

Andere Tipps

Nicht, dass Jon hat es nicht bereits abgedeckt, aber hier sind einige Links zu Blogs und Videos von Eric Lippert. Er ist eine schöne Aufgabe es mit Beispielen zu erklären.

https://blogs.msdn.microsoft.com/ericlippert/2007/10/16/covariance-and-contravariance-in-c-part-one/

Die Videos:

https://www.youtube.com/watch?v=3MQDrKbzvqU

https://www.youtube.com/watch?v=XRIadQaBYlI

https://www.youtube.com/watch?v=St9d2EDZfrg

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top