var funs = Enumerable.Range(0, 10).Select(x => (int y) => x + y);
foreach (var fun in funs)
Console.WriteLine("{0}", fun(10));
的错误是“一个隐式类型的局部变量声明不能初始化'System.Collections.Generic.IEnumerator.Current'“。我知道如何解决它(通过指定选择类型,如Select<int, Func<int, int>>
或通过使用一个辅助方法,如private static Func<T1, TR> MakeFunc<T1, TR>(Func<T1, TR> f) { return f; }
和使用Select(x => MakeFunc(y => x + y))
。
不过,我想明白其中的道理,编译器不能根据7.15.6,我最好的猜测是,它无法弄清楚它是否应该将内部lambda转换为Func或Expr。我是正确的还是有更多的东西?
仅供参考,这里是7.15.6说:
“一位不愿具名的函数F必须始终转换为委托类型d或表达式目录树类型E,无论是直接或通过executi代表创建表达式新D(F)。这种转换决定了匿名函数的结果“
尝试在代码块中包装您返回的lambda,看看会发生什么? –
这个编译? –
这可能有所帮助:http://stackoverflow.com/a/4966409/1223622 –