C# IEnumerable<;Func<;T、 S>&燃气轮机;和LINQ类型推断
C#编译器可以正确推断这些代码段中的s(字符串)类型:C# IEnumerable<;Func<;T、 S>&燃气轮机;和LINQ类型推断,c#,linq,type-inference,C#,Linq,Type Inference,C#编译器可以正确推断这些代码段中的s(字符串)类型: Func<int, string, string> f1 = (n, s) => s.Substring(n); Func<int, Func<string, string>> f2 = n => s => s.Substring(n); 问题是-如果所有需要的类型信息都是事先知道的,为什么类型推断在[1]中不起作用?所有关于类型的信息都是事先不知道的。在您的第一个工作代码段中,您
Func<int, string, string> f1 = (n, s) => s.Substring(n);
Func<int, Func<string, string>> f2 = n => s => s.Substring(n);
问题是-如果所有需要的类型信息都是事先知道的,为什么类型推断在[1]中不起作用?所有关于类型的信息都是事先不知道的。在您的第一个工作代码段中,您在两行上都告诉它希望将
s=>s.Substring(n)
转换为哪种委托类型
在您的第二个代码片段中,该信息唯一存在的地方是分配Select
。。。当编译器计算出Select
调用本身的含义时,这并不是重载和类型推断的一部分
因此,选择是:
- 使用
f2
- 在
调用中强制转换lambda表达式,或根据代码段使用Select
运算符new
- 直接为
选择提供类型参数:
var fs = numbers.Select<int, Func<string, string>>(n => s => s.Substring(n));
var fs=numbers.Select(n=>s=>s.Substring(n));
var fs = numbers.Select(n => new Func<string, string>(s => s.Substring(n));
var fs = numbers.Select(f2);
var fs = numbers.Select<int, Func<string, string>>(n => s => s.Substring(n));