IEnumerable <Func <T,S >>和LINQ类型推断

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]中不起作用?

Jon*_*eet 7

事先知道有关该类型的所有信息.在您的第一个工作片段中,您将在两行中告知它要委托您要s => s.Substring(n)转换的类型.

在你的第二个片段,其中的信息是目前唯一的地方是在的分配结果Select......而当编译器工作出了什么未使用过载和类型推断的一部分Select调用本身就意味着.

所以选项是:

  • 使用,分两步完成 f2
  • Select调用中转换lambda表达式,或new根据您的代码段使用运算符
  • Select直接提供类型参数:

    var fs = numbers.Select<int, Func<string, string>>(n => s => s.Substring(n));
    
    Run Code Online (Sandbox Code Playgroud)