Csharp有没有办法写出真正静态的λ表达式?

问题描述 投票:0回答:1

语言:C# .Net版本:8.0 IDE:VS2020 / VSCode 操作系统:Windows11

Csharp有没有办法写出真正静态的λ表达式?

我今天学习了柯里化并写了一个函数:

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.

这两种写法有什么本质区别?

c# lambda expression-trees
1个回答
0
投票

您可以使用

Func<T in, T out>
静态存储 lambda 表达式。
T in
是用于输入的数据类型,
T out
是用于输出的数据类型。

static Func<int, int> func = x => x * x;

//

//

Console.WriteLine(func.Invoke(2));

您可以使用

Invoke
方法同步调用结果并将输入传递给它。

© www.soinside.com 2019 - 2024. All rights reserved.