C # 4.0 et une combinaison de paramètres facultatifs et de surcharges vous avertissent-ils de l'ambiguïté?

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

Question

J'ai commencé à lire la version en accès anticipé de son livre de Jon Skeet, qui contient des sections sur C # 4.0, et une chose m'a frappé. Malheureusement, Visual Studio 2010 n’est pas disponible, j’ai donc pensé que je demanderais simplement ici et que je verrais si quelqu'un connaissait la réponse.

Si j'ai le code suivant, un mélange de code existant et de nouveau code:

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

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

Le compilateur se plaindra-t-il sur le site de définition ou sur le site d'appels d'éventuelles ambiguïtés?

Par exemple, que fera réellement ce morceau de code?

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

Va-t-il compiler? Appellera-t-il celui sans le paramètre z ou appellera-t-il celui avec le paramètre z?

Était-ce utile?

La solution

Il compilera sans avertissements et choisira la première surcharge.

Avec l'introduction de paramètres facultatifs et nommés, le mécanisme de résolution de surcharge de C # est devenu vraiment compliqué. Dans ce cas précis, cela a toutefois un sens. Comme d'habitude, le compilateur choisira la surcharge la plus spécifique correspondant aux arguments.

Je ne crois pas que ce cas particulier soit très 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 le pense pas. Je crains que vous deviez spécifier manuellement l'argument par défaut dans l'appel de méthode. Cependant, si les paramètres x ou y ont un nom différent, tel que:

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);

Autres conseils

Ceci est couvert dans la section "Résolution de surcharge". section du chapitre.

Lorsque le compilateur a le choix entre deux options égales par ailleurs, il utilisera une surcharge qui ne nécessite pas l'utilisation de paramètres facultatifs non fournis de préférence à celle qui le fait, mais c'est un choix binaire strict. S'il doit choisir entre une surcharge avec un paramètre facultatif non fourni et deux, cela sera considéré comme une situation ambiguë.

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

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

Si, toutefois, vos méthodes utilisaient des noms de paramètres différents, vous pourriez le 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top