Résolution des ambiguïtés avec des parameters facultatifs et des arguments nommés

J’ai deux méthodes sur mon projet tel que défini ci-dessous:

void Person(int ID, double height = 0.0, ssortingng team = "Knights") { //my codes } void Person(int ID, double height = 0.0, ssortingng team = "Knights", int age = 30) { //my codes } 

C’est ici que j’appelle la méthode:

 Person(1, 2.5, "Dark Ghost"); //calls first method 

Je n’ai pas eu d’erreur quand j’ai construit le projet, mais je ne comprends pas pourquoi la méthode ci-dessus appelle la première méthode?

et :

 Person(1, 46.5); //comstackr error. 

La spécification C # dit au § 7.5.3.2, concernant le choix d’une meilleure surcharge:

Si tous les parameters de [Méthode A] ont un argument correspondant alors que les arguments par défaut doivent être remplacés par au moins un paramètre facultatif dans [Méthode B], alors [Méthode A] est préférable à [Méthode B].

Lorsque vous spécifiez une valeur pour tous les parameters:

 Person(1, 2.5, "Dark Ghost"); 

La règle ci-dessus fait de la première méthode un meilleur candidat et est choisie comme étant la surcharge correcte.

Quand vous ne le faites pas:

 Person(1, 46.5); 

La règle ne s’applique pas et la résolution de la surcharge est ambiguë.


Vous pourriez dire, pourquoi ne pas choisir celui qui a le moins de parameters? Cela semble bien au début, mais pose un problème lorsque vous avez quelque chose comme ceci:

 void Foobar(int a, ssortingng b = "foobar") { } void Foobar(int a, int b = 0, int c = 42) { } ... Foobar(1); 

Dans ce cas, il n’y a aucune raison valable de choisir le premier sur le second. Ainsi, vous ne pouvez résoudre ce problème correctement qu’en fournissant une valeur pour tous les parameters.

Si possible, celui qui peut être appliqué sans parameters par défaut est appelé.

Dans le premier cas

 Person(1, 2.5, "Dark Ghost"); 

La première méthode s’appelle.

Dans le second cas:

 Person(1, 46.5); 

Cela entraînera simplement une erreur de construction. “L’appel est ambigu entre les méthodes ou propriétés suivantes: Test.Person (int, double, chaîne) et Person (int, double, chaîne, int)”.

TL: DR La première méthode (la plus spécifique) sera appelée car dans ce cas, aucun paramètre ne doit être lié à l’aide de valeurs par défaut.

Pour une discussion en profondeur, reportez-vous à cet article .