2009-07-31 4 views
6

Ich habe begonnen, Jon Skeet frühe Version seines Buches zu lesen, die Abschnitte auf C# 4.0 enthält, und eine Sache fiel mir auf. Leider habe ich Visual Studio 2010 nicht verfügbar, also dachte ich, ich würde einfach hier nachfragen und sehen, ob jemand die Antwort wusste.Gibt C# 4.0 und eine Kombination aus optionalen Parametern und Überladungen eine Warnung vor Mehrdeutigkeiten?

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 entweder bei der Definition Website oder Aufrufort über mögliche Mehrdeutigkeit beschweren?

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

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

Wird es kompilieren? Wird es den einen ohne den Parameter z aufrufen, oder wird er den mit dem Parameter z aufrufen?

+0

beiseite diese spezifische Frage Weggehen, Ich würde mich sehr freuen, jedes andere Feedback zu den neuen Kapiteln zu erhalten - entweder über ähnliche Fragen oder direkt per E-Mail ([email protected]).Hoffe, Sie genießen die neuen Sachen :) –

+0

Ich werde die Datei, die ich heruntergeladen habe, lesen, bevor ich noch mehr Feedback oder Fragen senden;) Aber ja, ich würde mich freuen, Feedback zu geben. Ich bringe die Datei über das Wochenende mit in ein Haus ohne Internet, also werde ich mich wahrscheinlich damit beschäftigen. –

Antwort

6

Es wird ohne Warnungen kompilieren und die erste Überlastung 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 macht es jedoch Sinn. Wie üblich wählt der Compiler die spezifischste Überladung aus, die den Argumenten entspricht.

Ich glaube nicht, diese speziellen 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 identisch (in Bezug auf die Überladungsauflösung) arbeitet.

Follow-up Antwort: Ich glaube nicht. Ich fürchte, Sie müssen das Standardargument beim Methodenaufruf manuell angeben. Wenn jedoch x oder y Parameter hatten einen anderen Namen wie:

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

Sie mit der zweiten Überlastung wählen könnte:

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

Folgefrage: Gibt es eine Möglichkeit, die zweite Überlast aufzurufen, ohne den Parameter 'z' anzugeben? – Blixt

9

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

Wenn der Compiler zwei ansonsten gleiche Optionen zur Auswahl hat, wird er eine Überladung verwenden, die keine unsupplementierten optionalen Parameter anstelle einer solchen verwenden muss, aber es ist eine strikte Binärauswahl. Wenn es zwischen einer Überladung mit einem nicht bereitgestellten optionalen Parameter und zwei auswählen muss, wird dies als eine mehrdeutige Situation betrachtet.

Um Ihren 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 es dann tun:

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 
+0

Serves mir Recht, den Zug zu springen :) –

Verwandte Themen