2009-07-31 3 views
6

J'ai commencé à lire la version de Jon Skeet de son livre, qui contient des sections sur C# 4.0, et une chose m'a frappé. Malheureusement, je n'ai pas Visual Studio 2010 disponible, alors j'ai pensé que je demanderais plutôt à la place et verrions si quelqu'un connaissait la réponse.Est-ce que C# 4.0 et une combinaison de paramètres optionnels et de surcharges vous avertissent de l'ambiguïté?

Si je le code suivant, un mélange de code existant, et le nouveau code:

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

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

Est-ce que le compilateur se plaindre, soit sur le site de la définition ou le site d'appel au sujet de l'ambiguïté possible? Par exemple, que va faire ce morceau de code?

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

Est-ce qu'il compilera? Appellera-t-il celui sans le paramètre z, ou appellera-t-il celui avec le paramètre z?

+0

En laissant de côté cette question spécifique, Je serais très heureux de recevoir d'autres commentaires sur les nouveaux chapitres - soit par des questions similaires ou directement par e-mail ([email protected]).J'espère que vous apprécierez les nouvelles choses :) –

+0

Je vais lire le fichier que j'ai téléchargé avant d'envoyer d'autres commentaires ou des questions;) Mais oui, je serais heureux de fournir des commentaires. J'amène le dossier avec moi dans une maison sans Internet pendant le week-end, donc je vais probablement m'y plonger. –

Répondre

6

Il compilera sans avertissements et choisira la première surcharge. Avec l'introduction de paramètres optionnels et nommés, le mécanisme de résolution de surcharge de C# est devenu vraiment compliqué. Dans ce cas précis, il est logique cependant. Comme d'habitude, le compilateur choisira la surcharge la plus spécifique qui correspond aux arguments.

Je ne crois pas que ce cas particulier est bien différent de C# 1.0:

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

qui fonctionne de manière identique (en termes de résolution de surcharge).

réponse de suivi: Je ne pense pas. Je crains que vous deviez spécifier manuellement l'argument par défaut dans l'appel de la méthode. Cependant, si le paramètre x ou y avait un autre nom comme:

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

vous pouvez choisir la deuxième surcharge avec:

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

Question de suivi: existe-t-il un moyen d'appeler la deuxième surcharge sans spécifier le paramètre 'z'? – Blixt

9

Ceci est couvert dans la section « Résolution de surcharge » du chapitre. Lorsque le compilateur a le choix entre deux options égales, il utilisera une surcharge qui n'a pas besoin d'utiliser des paramètres optionnels non fournis, contrairement à ce qui est le cas, mais c'est un choix binaire strict. S'il doit choisir entre une surcharge avec un paramètre facultatif non fourni et deux, il considérera qu'il s'agit d'une situation ambiguë.

Pour répondre à votre commentaire de suivi, je ne connais aucun moyen de forcer une surcharge avec le paramètre optionnel à être utilisé sans le spécifier. Vous ne pouvez pas utiliser l'un de ceux-ci, par exemple:

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

Toutefois, si vos méthodes ont utilisé différents noms de paramètres, vous pouvez faire alors:

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

Me sert à droite pour sauter le train en marche :) –

Questions connexes