Ist C # 4.0 und eine Kombination von optionalen Parameter und Überlastungen geben Sie eine Warnung über Zweideutigkeit?

StackOverflow https://stackoverflow.com/questions/1211203

Frage

Ich habe angefangen, Jon Skeet frühen Zugang Version seines Buches zu lesen, die Abschnitte auf C # 4.0 enthält, und eine Sache, schlug mich. Leider nur hier statt ich, ich habe ich nicht Visual Studio 2010 zur Verfügung, so dachte würde fragen und sehen, ob jemand die Antwort kannte.

Wenn ich den folgenden Code, eine Mischung aus vorhandenen Code und neuen Code:

public void SomeMethod(Int32 x, Int32 y) { ... }

public void SomeMethod(Int32 x, Int32 y, Int32 z = 0) { ... }

Wird der Compiler beschwert entweder bei der Definition Website oder Aufrufort über mögliche Zweideutigkeit?

Zum Beispiel, was wird dieses Stück Code tatsächlich tun?

SomeClass sc = new SomeClass();
sc.SomeMethod(15, 23);

Wird es kompilieren? Wird es das eine ohne das z Parameter nennen, oder wird es das mit dem z Parameter nennen?

War es hilfreich?

Lösung

Es wird ohne Warnungen kompiliert und die erste Überlast wählen.

Mit der Einführung von optionalen und benannte Parameter, hat sich die Überladungsauflösung Mechanismus von C # wirklich kompliziert. In diesem speziellen Fall, es macht aber Sinn. Wie üblich, wählt der Compiler die spezifischste Überlastung, die die Argumente übereinstimmt.

Ich glaube nicht, dieser spezielle Fall sehr verschieden von C # 1.0 ist:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 x, Int32 y, params Int32[] z) { }

, die gleich (in Bezug auf die Überladungsauflösung) funktioniert.

Follow-up Antwort: Ich glaube nicht. Ich fürchte, Sie werden manuell das Standardargument in dem Methodenaufruf angeben. Wenn jedoch x oder y Parameter haben einen anderen Namen wie:

public void SomeMethod(Int32 x, Int32 y) { } 
public void SomeMethod(Int32 t, Int32 y, Int32 z = 0) { }

Sie könnte die zweite Überlastung mit wählen:

obj.SomeMethod(t: 10, y: 20);

Andere Tipps

Dies ist in der „Überlast Lösung“ des Kapitels behandelt.

Wenn der Compiler hat zwei ansonsten gleich Optionen zur Auswahl, wird es eine Überlastung benutzen, die keine unversorgt optionale Parameter in dem Vorzug eines verwenden müssen, das tut, aber es ist eine strenge binäre Wahl. Wenn es zwischen einer Überlastung mit einem unversorgten optionalem Parameter und zwei wählen, wird es die Ansicht, dass eine unklare Situation sein.

Um die Follow-up-Kommentar zu beantworten, ich kenne keinen Weg, um eine Überlastung mit dem optionalen Parameter zwingen, ohne es zu spezifizieren verwendet werden. Sie können auch nicht davon, zum Beispiel verwenden:

// Both invalid
sc.SomeMethod(15, 23, );
sc.SomeMethod(15, 23, z:)

Wenn jedoch Ihre Methoden verschiedene Parameternamen verwendet, Sie könnte tut es dann:

public void SomeMethod(Int32 x, Int32 y) { ... }
public void SomeMethod(Int32 a, Int32 b, Int32 c = 0) { ... }

sc.SomeMethod(a: 15, b: 23); // Calls second method
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top