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

War es hilfreich?

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.

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