Warum berücksichtigt C # nicht den Rückgabetyp einer Funktion im Polymorphismus?

7

Es gibt zwei Funktionen mit demselben Namen und demselben Parametersatz, jedoch mit unterschiedlichen Rückgabetypen. Warum ist es keine Form von Polymorphie, d. H. Überladen von Methoden? Warum ist es nicht vom Compiler erlaubt?

    
Manish Dubey 22.03.2014, 20:05
quelle

5 Antworten

14

Weil C # so entworfen wurde, dass Typen von innerhalb nach außerhalb analysiert werden können. Stellen Sie sich vor, wenn Sie

haben %Vor%

und dann ein Anruf

%Vor%

OK, großartig, natürlich könnten wir sagen, dass die Float-Version gesucht wurde. Aber dann sagst du:

%Vor%

OK, jetzt welche Version wurde gesucht? Die Regel ist Finde heraus, was N () bedeutet und dann finde heraus, was die beste Überladung von M ist, wenn du weißt, was N () bedeutet . Sie argumentieren von innerhalb nach außerhalb .

Die Überladungsauflösung auf der Grundlage des Rückgabetyps erfordert eine Argumentation von außerhalb nach innerhalb und das kann ein Los schwieriger sein.

    
Eric Lippert 22.03.2014 20:25
quelle
3

Betrachten Sie Folgendes:

%Vor%

Wenn ich combine (1, 2) aufrufen würde, kann der Compiler nicht wissen, welche der beiden Methoden ich aufrufen möchte (es ist mehrdeutig).

Sie könnten fast dafür plädieren, Rückgabetypen zu überprüfen, aber was ist mit:

%Vor%

Was sollte der Wert von c oder d im obigen sein? 3? -1? Es ist unmöglich zu sagen. Wie steht es mit der letzten Aussage, wo kein Wert vergeben wird? Ich habe keine Überladung definiert, die void zurückgibt, also welche der beiden Methoden sollte sie aufrufen?

    
Fayth 22.03.2014 20:09
quelle
2

Um Zweideutigkeiten an der Call-Site zu vermeiden. Betrachten Sie die folgende Schnittstelle:

%Vor%

jetzt, wenn Sie

anrufen %Vor%

was sollte aufgerufen werden?

    
spender 22.03.2014 20:08
quelle
0

Weil es nicht zwingend ist, den Rückgabetyp einer Variablen zuzuordnen. Der Compiler kann nicht erzwingen, den zurückgegebenen Wert einer Variablen zuzuweisen. Selbst wenn es dies erzwingt, macht es keinen Sinn, einem float keinen Integer-Wert zuzuweisen. wie in einer anderen Antwort gezeigt.

    
Tauseef 22.03.2014 20:14
quelle
0

Ich glaube, dass dies mit einem komplexen Regelwerk (Durchsetzung der Eindeutigkeit) umgesetzt werden könnte, aber es würde zahlreiche Möglichkeiten einführen, den Code versehentlich zu brechen.

Es würde viele verwirrende Sprachquirks mit sich bringen, aufgrund der unvermeidlichen Komplexität der Regeln (ähnlich wie Vergleichsoperatoren in PHP).

Lohnt es sich? Was gewinnen wir damit? Die Frage "warum nicht" sollte umgekehrt werden: warum ja?

    
Konrad Morawski 22.03.2014 20:28
quelle