ConsidéronsMéthode d'inférence ne fonctionne pas avec le groupe de procédé
void Main()
{
var list = new[] {"1", "2", "3"};
list.Sum(GetValue); //error CS0121
list.Sum(s => GetValue(s)); //works !
}
double GetValue(string s)
{
double val;
double.TryParse(s, out val);
return val;
}
La description de l'erreur CS0121 est
L'appel est ambiguë entre les méthodes ou les propriétés suivantes:
'System.Linq.Enumerable.Sum<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,decimal>)'
et'System.Linq.Enumerable.Sum<string>(System.Collections.Generic.IEnumerable<string>, System.Func<string,decimal?>
) »
Ce que je ne comprends pas, c'est quoi dans formation ne s => GetValue(s)
donner au compilateur que simplement GetValue
ne - n'est pas le dernier sucre syntaxique pour le premier?
Si vous aviez un horodateur, comment les changeriez-vous? Souhaitez-vous leur faire réfléchir sur les types de retour, comme les lambdas?Ou feriez-vous un changement subtil différent? – configurator
Intéressant! Je jouais avec LinqPad et en effet, même si j'ai 'double D1 (chaîne s)' et 'int D1 (chaîne s)', un groupe de méthodes avec une signature de 'chaîne M (chaîne)' produirait une ambiguïté erreur d'appel - même si les deux signatures ne correspondent pas de toute façon. Ceci par opposition à un lambda, qui les essaierait tous et vous donnerait une erreur de conversion sur le dernier (le premier?) Qu'il essaye. –
Cependant, s'il n'y a pas de problème de surcharge (et que la mauvaise signature est utilisée), l'erreur du groupe de méthodes ("M a le mauvais type de retour") est légèrement plus informative que celle de lambda ("Impossible de convertir 'double'") –