gpt4 book ai didi

c# - Lambda 和类型推断

转载 作者:行者123 更新时间:2023-11-30 12:30:16 25 4
gpt4 key购买 nike

我无法理解为什么以下代码会给我一个错误的原因:

 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 必须始终直接或通过执行委托(delegate)创建表达式 new D(F) 转换为委托(delegate)类型 D 或表达式树类型 E。此转换决定了匿名函数的结果”

最佳答案

原因很简单:

编译如何得出它应该是Func<int, int>的结论? ?他根本做不到!

假设您有自己的委托(delegate):

 public delegate int F(int i);

编译器如何在 Func<int, int> 之间进行选择?和 F ?这些是完全不同的类型,有两个共同点:都有委托(delegate)并且具有相同的签名(一个参数和返回类型,都是 int 类型)。

所以编译器无法选择;你将不得不这样做:

var funs = Enumerable.Range(0, 10).Select<int, Func<int,int>>(x => y => x + y);

var funs = Enumerable.Range(0, 10).Select<int, F>(x => y => x + y);

一个小好处:你可以删除 inty 之前.

关于c# - Lambda 和类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16636571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com