rkr*_*ahl 5 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);
Run Code Online (Sandbox Code Playgroud)
但它不能在这一个[1]:
var numbers = Enumerable.Range(1, 10);
IEnumerable<Func<string, string>> fs = numbers.Select(n => s => s.Substring(n));
Run Code Online (Sandbox Code Playgroud)
为了使它工作,必须做这样的事情:
var fs = numbers.Select(n => new Func<string, string>(s => s.Substring(n));
Run Code Online (Sandbox Code Playgroud)
要么
var fs = numbers.Select(f2);
Run Code Online (Sandbox Code Playgroud)
问题是 - 如果预先知道关于类型的所有必需信息,为什么类型推断在[1]中不起作用?
事先不知道有关该类型的所有信息.在您的第一个工作片段中,您将在两行中告知它要委托您要s => s.Substring(n)转换的类型.
在你的第二个片段,其中的信息是目前唯一的地方是在的分配结果的Select......而当编译器工作出了什么未使用过载和类型推断的一部分Select调用本身就意味着.
所以选项是:
f2Select调用中转换lambda表达式,或new根据您的代码段使用运算符Select直接提供类型参数:
var fs = numbers.Select<int, Func<string, string>>(n => s => s.Substring(n));
Run Code Online (Sandbox Code Playgroud)