为什么我的通用高阶函数不接受方法组作为参数?

时间:2017-08-09 09:43:13

标签: c# .net generics higher-order-functions currying

我有以下本地方法。

void Test(int i, int j, int k) {
    Console.WriteLine($"{i} {j} {k}");
}

我有一个更高阶的函数,如下所定义

public static class Curry {
    public static Func<T0, T1, Action<T2>> 
        act2f3<T0, T1, T2>(Action<T0, T1, T2> fn) =>
           (T0 t0, T1 t1) => (T2 t2) => fn(t0, t1, t2);

}

它将原始函数拆分为两个函数调用。第一个函数接受前两个参数,第二个函数接受最后一个参数。当调用第二个函数时,将使用所有参数调用原始函数。

一个简单的用法是

var cfn = Curry.act2f3( Test );
var cfn2 = cfn(0,1);
cfn2(3); 

cfn2被称为之后的输出

"0 1 3"    

但是C#编译器不允许这样做。

  

方法的类型参数&#39; Curry.act2f3(Action)&#39;无法从使用中推断出来。尝试指定类型   明确的论点。

但以下情况确实有效

 Curry.act2f3( (int i, int j, int k) => Test( i, j, k ) );

但并没有真正帮助,因为它首先打败了编写这个库的目的。目的是操作函数参数的DRY过程。

是否有一个微妙的伎俩,我没有让它工作?

1 个答案:

答案 0 :(得分:0)

很遗憾c#编译器无法推断传递函数Test的类型参数。

Curry.act2f3( (int i, int j, int k) => Test( i, j, k ) );语句适用于您在声明int中指定(int i, int j, int k)类型。

如果指定如下通用类型,var cfn = Curry.act2f3( Test );将起作用:

var cfn = Curry.act2f3<int, int, int>( Test );