Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IEnumerable<;Func<;T、 S>&燃气轮机;和LINQ类型推断_C#_Linq_Type Inference - Fatal编程技术网

C# IEnumerable<;Func<;T、 S>&燃气轮机;和LINQ类型推断

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]中不起作用?所有关于类型的信息都是事先不知道的。在您的第一个工作代码段中,您

C#编译器可以正确推断这些代码段中的s(字符串)类型:

 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
  • Select
    调用中强制转换lambda表达式,或根据代码段使用
    new
    运算符
  • 直接为
    选择提供类型参数:

    var fs = numbers.Select<int, Func<string, string>>(n => s => s.Substring(n));
    
    var fs=numbers.Select(n=>s=>s.Substring(n));
    

感谢您的及时回复。真遗憾,它没有像我在c#中想象的那样工作。有可能我被f#宠坏了,在这里,像让fs:(string->string)seq=numbers |>seq.map(fun->fun s->s.Substring(n))这样的事情是可能的。@rkrahl:是的,f#中的类型推断肯定更强大。
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));