我有以下本地方法。
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过程。
是否有一个微妙的伎俩,我没有让它工作?
答案 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 );
。