语言:C# .Net版本:8.0 IDE:VS2020 / VSCode 操作系统:Windows11
我今天学习了柯里化并写了一个函数:
using System.Linq.Expressions;
using Curryfy;
object Apply(Delegate _operator, object? arg1)
{
Type t = _operator.GetType();
if (!t.IsGenericType || t.GenericTypeArguments.Length < 2 || t.Name != "Func`" + t.GenericTypeArguments.Length)
throw new Exception();
var args = _operator.Method.GetParameters().Select(p => Expression.Variable(p.ParameterType)).ToArray();
Expression expression = Expression.Call(_operator.Method, args);
foreach (var arg in args.Reverse())
expression = *Expression.Lambda(expression, arg);*
Console.WriteLine(expression);
return null;
}
***int sum(int a, int b) => a + b;***
System.Console.WriteLine(sum);
Apply(sum, 10);
可以正确运行,结果也符合我的预期:
System.Func`3[System.Int32,System.Int32,System.Int32]
Param_0 => Param_1 => <<Main>$>g__sum|0_1(Param_0, Param_1)
这个求和函数甚至不使用“静态”。 但是当我将这一行更改为:
Func<int, int, int> sum = static (int a, int b) => a + b;
Expression.Call(_operator.Method, args) 抛出异常表示:
Static method requires null instance, non-static method requires non-null instance.
这两种写法有什么本质区别?
您可以使用
Func<T in, T out>
静态存储 lambda 表达式。 T in
是用于输入的数据类型,T out
是用于输出的数据类型。
static Func<int, int> func = x => x * x;
//
//
Console.WriteLine(func.Invoke(2));
您可以使用
Invoke
方法同步调用结果并将输入传递给它。