Warum brauchen wir neue Keywords für Kovarianz und Kontra in C #?
-
06-07-2019 - |
Frage
Kann mir jemand erklären, warum es notwendig ist, einen oder in Parameter hinzuzufügen, um anzuzeigen, dass ein generischer Typ ist Co oder Contra-Variante in C # 4.0?
Ich habe versucht, zu verstehen, warum dies wichtig ist und warum der Compiler kann nicht nur herausfinden ..
Danke,
Josh
Lösung
Eric Lippert, der auf dem Langauge arbeitet, hat eine Reihe von Beiträgen über Msdn, die die anstehenden Probleme zu klären helfen sollen:
http://blogs.msdn.com/ericlippert/ Archiv / tags / Kovarianz + und + Kontra / default.aspx
Wenn die Artikel zu diesem Link angezeigt Lesen, am unteren Rand beginnen und aufzuarbeiten.
Schließlich werden erhalten Sie # 7 (Warum brauchen wir eine Syntax überhaupt?) .
Andere Tipps
Wir haben nicht wirklich Notwendigkeit sie, mehr brauchen wir abstract
auf Klassen oder beide out
und ref
. Sie existieren nur so, dass wir als Programmierer können unsere Absicht kristallklar machen, so dass die Wartung Programmierer wissen, was wir tun, und der Compiler kann bestätigen, dass wir es richtig machen.
Nun, das Hauptproblem ist, dass wenn Sie eine Klassenhierarchie wie:
class Foo { .. }
class Bar : Foo { .. }
Und Sie IEnumerator<Bar>
haben, können Sie nicht, dass als IEnumerator<Foo>
verwenden, obwohl das vollkommen sicher sein würde. In 3,5 zwingt dies eine große Anzahl von schmerzhaften Verrenkungen. Dieser Vorgang würde immer sicher sein, werden aber vom Typ System verweigert, weil sie nicht über die kovariante Verwendung des generischen Typparameters nicht kennen. IEnumerator<Bar>
kann nur eine Bar
zurückkehren und jede Bar
ist ein Foo
.
Und falls Sie eine IEqualityComparer<Foo>
hatte es verwendet werden kann jedes Paar von Objekten des Typs Foo
zu vergleichen, selbst wenn eine oder beide ein Bar
ist, aber es kann nicht in eine IEqualityComparer<Bar>
gegossen werden, weil sie nicht über die kontra Verwendung nicht kennt der generischen Typparameter. IEqualityComparer<Foo>
nur verbraucht Objekte vom Typ Foo
und jeder Bar
ist ein Foo
.
Ohne diese Schlüsselwörter wir gezwungen, das generische Argument annehmen kann, da beide ein Argument auf ein Verfahren und als Ergebnistyp eines Verfahrens auftreten, und so können wir nicht sicher einer der oben genannten Umwandlungen ermöglichen.
Mit ihnen das Typsystem ist frei, uns zu ermöglichen, die durch das Schlüsselwort angegebene Richtung, um sicher upcast und gesenkten zwischen diesen Schnittstellen und wir bekommen Fehler anzeigt, wenn wir die Disziplin verstoßen würde erforderlich, dass die Sicherheit zu gewährleisten.
Die in
und out
Schlüsselwörter sind Schlüsselwörter, seit C # 1.0 und haben im Zusammenhang mit in
- und out
- Parametern an Methoden verwendet.
Kovarianz und Kontra sind Einschränkungen auf, wie man eine Schnittstelle implementieren kann. Es gibt keinen guten Weg, um sie zu schließen -. Der einzige Weg, wie ich glaube, die aus der Nutzung ist, und das wäre chaotisch und am Ende würde es nicht funktionieren
Jon und Joel bereitgestellt beide eine ziemlich vollständige Antwort auf diese, aber das Endergebnis ist, dass sie nicht so viel sind erforderlich durch den Compiler, sondern helfen, die Sicherheit der Umsetzung zu garantieren, indem sie ausdrücklich darauf hinzuweisen die Varianz des Parameters. Dies ergibt sich ein sehr ähnliches Muster zu erfordern, die out
oder ref
Schlüsselwort sowohl auf der rufenden Seite und der Erklärung Website.