13 Stimmen

Warum unterstützt C#/CLR keine Methodenüberschreibung co/contra-variance?

Es gibt eine ganze Reihe von Fragen und Antworten darüber, wie man die Einschränkung von C# umgehen kann, dass Methodenrückgabe- (und Argument-) Typen bei Überschreibungen nicht in kompatible Typen geändert werden können, aber warum gibt es diese Einschränkung, entweder im C#-Compiler oder in der CLR? Wie ich sehe, gibt es nichts, was brechen könnte, wenn co/contra-Varianz erlaubt war, so was ist der Grund dafür?

Eine ähnliche Frage könnte für die Erweiterung von Zugriffsparametern gestellt werden - z.B. das Überschreiben einer geschützten internen Methode mit einer öffentlichen Methode (etwas, das Java unterstützt, IIRC)

3voto

Robert Kozak Punkte 2045

Eric Lippert hat diese Frage bereits viel besser beantwortet als ich es könnte.

Sehen Sie sich seine Serie über Kovarianz und Kontravarianz in C#

et

Wie funktioniert C# 4.0 Generic Covariance & Contra-variance Implmeneted?

EDIT: Eric wies darauf hin, dass er nicht über die Konvarianz des Rückgabetyps spricht, aber ich beschloss, den Link in dieser Antwort zu belassen, da es sich um eine coole Artikelserie handelt und jemand sie nützlich finden könnte, wenn er nach diesem Thema sucht.

Diese Funktion wurde angefordert und vor fast 5 Jahren hat Microsoft mit "Danke, dass Sie das protokolliert haben" geantwortet. Wir hören diesen Wunsch sehr oft. Wir werden es in der nächsten Version berücksichtigen."

Und jetzt zitiere ich Jon Skeet, denn es wäre keine richtige Antwort auf StackOverflow ohne eine Antwort von Jon Skeet. Kovarianz und ungültige Rückgabearten

Ich vermute stark, dass die Antwort in der Implementierung der CLR liegt liegt und nicht in irgendeinem tiefen semantischen Grund - die CLR muss wahrscheinlich wissen, ob es einen Rückgabewert gibt oder nicht einen Rückgabewert geben wird, damit sie Dinge mit dem Stack zu tun. Trotzdem scheint es ein bisschen schade zu sein, im in Bezug auf die Eleganz. Ich kann nicht sagen, dass ich dass ich das im wirklichen Leben jemals für nötig Leben, und es wäre relativ einfach zu fälschen (für bis zu vier Parameter) in .NET 3.5 zu fälschen, indem man einfach einen Konverter schreibt von Func<X> zu Action<X> , Func<X,Y> zu Action<X,Y> usw. Es nervt ein bisschen aber :)

3voto

Shashi Penumarthy Punkte 793

Diese Antwort bezieht sich nicht auf C#, aber sie hat mir geholfen, die Probleme besser zu verstehen, und vielleicht hilft sie auch anderen: Warum gibt es keinen Parameter Gegenabweichung für die Übersteuerung?

0voto

ivenxu Punkte 629

Die Einführung der Kovarianz des Rückgabewerts scheint keinen wesentlichen Nachteil zu haben, wie es Java und C++ getan haben. Die Einführung der Kontravarianz von Formalparametern stiftet jedoch echte Verwirrung. Ich denke, diese Antwort https://stackoverflow.com/a/3010614/1443505 in C++ ist auch für C# gültig.

-1voto

Joel Coehoorn Punkte 377088

Das geht, man muss nur auf VS2010/.Net 4.0 warten.

-1voto

Marc Gravell Punkte 970173

Um Joel's Antwort zu erweitern - die CLR hat begrenzte Varianz für eine lange Zeit unterstützt, aber der C#-Compiler verwendet sie nicht bis 4.0 mit den neuen "in" und "out" Modifikatoren auf generische Schnittstellen und Delegaten. Die Gründe sind kompliziert, und ich würde in ein Durcheinander versuchen zu erklären, aber es ist nicht so einfach, wie es scheint.

Sie können eine "geschützte interne" Methode in eine "öffentliche" Methode umwandeln, indem Sie die Methode ausblenden:

public new void Foo(...) { base.Foo(...); }

(sofern die Argumente usw. ebenfalls öffentlich sind) - ist das sinnvoll?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X