Wie wählt der Compiler die Methode, die aufgerufen werden soll, wenn ein Parametertyp nicht eindeutig ist?

8

Ich habe den folgenden Code:

%Vor%

und wenn ich den Test "TestFoo ()" starte, ist die Konsolenausgabe "Foo - string". Wie entscheidet der Compiler, welche Methode aufgerufen wird?

    
Darksider 23.04.2010, 06:31
quelle

1 Antwort

16

Es wendet die Regeln für "bessere Umwandlung" (7.4.3.3 der C # 3-Spezifikation) als Teil der Überladungsauflösung an (Abschnitt 7.4.3 im Allgemeinen).

Grundsätzlich gibt es in diesem Fall eine Konvertierung von string nach object , aber nicht von object nach string . Nach den Regeln ist die Konvertierung von null nach string besser als die von null nach object , daher wird die Überladung mit dem Parameter string verwendet.

Die Überladungsauflösung kann extrem kompliziert werden, wenn die folgenden Faktoren beteiligt sind:

  • Im Kandidatensatz
  • könnten generische Methoden vorhanden sein
  • Wenn dort sind generische Methoden, wird Typrückschluss auf jeden von ihnen separat angewendet, was zu verschiedenen Conversion-Möglichkeiten führt
  • Wenn irgendwelche Argumente Methodengruppen sind, könnten sie in verschiedene Delegattypen konvertiert werden - möglicherweise sogar mit verschiedenen Methodensignaturen, wenn die benannte Methodengruppe auch mehrere Überladungen aufweist
  • Vererbung kann zu überraschenden Ergebnissen führen
  • Parameter-Arrays ( params ) fügen dem Spaß
  • hinzu
  • Optionale Parameter in C # 4 tragen ebenfalls zur Entscheidung bei

Grundsätzlich kann das Überladen eine echte Dose Würmer sein - wenn möglich, Überbelastungen entwerfen, so dass nur einer von ihnen jemals ein gültiges Ziel eines bestimmten Methodenaufrufs sein wird, so dass Sie sich nicht um die detaillierten Regeln kümmern müssen.

    
Jon Skeet 23.04.2010, 06:32
quelle

Tags und Links