Je vais avoir un peu de mal à comprendre la raison pour laquelle le code suivant me donne une erreur:lambdas et inférence de type
var funs = Enumerable.Range(0, 10).Select(x => (int y) => x + y);
foreach (var fun in funs)
Console.WriteLine("{0}", fun(10));
L'erreur est "Une implicitement déclaration variable locale typée ne peut pas être initialisé avec 'System.Collections.Generic.IEnumerator.Current' ". Je sais comment le résoudre (soit en spécifiant le type de sélectionner, comme Select<int, Func<int, int>>
ou en utilisant une méthode d'assistance tels que private static Func<T1, TR> MakeFunc<T1, TR>(Func<T1, TR> f) { return f; }
et en utilisant Select(x => MakeFunc(y => x + y))
.
Cependant, je voudrais comprendre la raison pour laquelle le compilateur ne peut pas déduire les types.Ma meilleure estimation est, selon 7.15.6, il ne peut pas comprendre si elle devrait traduire le lambda interne à un Func ou Expr.Suis-je correct ou y at-il quelque chose de plus?
Pour référence, voici ce que dit 7.15.6:
"Une fonction anonyme F doit toujours être convertie en un délégué de type D ou une arborescence d'expression de type E, soit directement, soit via l'exécutable. d'une expression de création de délégué nouvelle D (F). Cette conversion détermine le résultat de la fonction anonyme «
Essayez d'envelopper le lambda que vous retournez dans un bloc de code, voyez ce qui se passe? –
Cela compile? –
Cela pourrait aider: http://stackoverflow.com/a/4966409/1223622 –