J'avais été à la programmation dans le cadre de l'hypothèse que, lors de l'appel d'une méthode en C# 4.0, la fourniture de noms pour vos arguments n'auraient pas d'incidence sur l'issue à moins que vous ont été "sauter" d'un ou de plusieurs paramètres facultatifs.
J'ai donc été un peu surpris de découvrir le comportement suivant:
Une méthode qui prend un Func<T>
, l'exécute et renvoie le résultat:
public static T F<T>(Func<T> f)
{
return f();
}
Et une autre méthode à partir de laquelle la méthode ci-dessus est visible:
static void Main()
{
string s;
l'appel de F (sans arguments nommés) compile sans problèmes:
s = F<string>(() => "hello world"); // with explicit type argument <string>
s = F(() => "hello world"); // with type inference
Et lors de l'utilisation d'un argument nommé...
s = F<string>(f: () => "hello world");
... au-dessus de la ligne de code en utilisant le type explicite argument encore compile sans problèmes. Et peut-être il n'est pas surprenant, si vous avez ReSharper installé, il va suggèrent que l "argument de Type spécification est redondante".
Cependant, lors de la suppression de l'argument de type...
s = F(f: () => "hello world");
le compilateur C# va signaler cette erreur:
Le type des arguments de la méthode 'Programme.F(Système D'.Func)' ne peut pas être déduit à partir de l'utilisation. Essayez de spécifier le type des arguments explicitement.
Est-il une explication logique de cette interaction entre les arguments nommés et l'inférence de type?
Est ce comportement documenté quelque part dans la spécification du langage?
Je comprends qu'il n'est pas nécessaire pour moi de nom de l'argument. Cependant, j'ai découvert ce comportement dans des situations beaucoup plus complexes où j'ai pensé qu'il pourrait être judicieux de nommer les arguments dans mon appel de méthode interne des fins de documentation. Je ne demande pas comment contourner ce problème. Je suis en train d'essayer de comprendre certaines subtilités de la langue.
Pour rendre les choses plus intéressantes, j'ai découvert que la suite de toutes les compile sans problèmes:
Func<string> func = () => "hello world";
s = F<string>(func);
s = F(func);
s = F<string>(f: func);
s = F(f: func);
}
En passant, j'ai observé le même comportement avec les méthodes statiques. J'ai juste choisi d'utiliser des méthodes statiques pour prendre l'exemple ici, un peu plus courte.