C# 表达式语法

cwa*_*cwa 1 c# expression-trees

我正在考虑Expression<Func<>>和 之间的区别Func<>,想知道是否可以将静态方法转换为表达式树,如下所示:

class Program
{
    static void Main(string[] args)
    {
        Func<int, int> t = x => hrm(x);
        Func<int, int> t2 = new Func<int, int>(hrm);

        // Works as expected:
        Expression<Func<int, int>> et = x => hrm(x);
        // Brokenness:
        Expression<Func<int, int>> et2 = new Func<int, int>(hrm);
    }

    static int hrm(int x)
    {
        return x + 9;
    }
}
Run Code Online (Sandbox Code Playgroud)

第二个“Func<>”有何特别之处,以至于它无法转换为表达式,而第一个“Func<>”可以转换为表达式?

Sea*_*lin 5

我认为您的困惑来自于 lambda 可以在 C# 中表示表达式或委托(具有完全相同的语法)这一事实。所以这段代码:

x => hrm(x)
Run Code Online (Sandbox Code Playgroud)

根据写在哪里,意思不同。当分配给 时Func<int, int>,它会像平常一样编译以创建Func<int, int>委托。但是,当分配给表达式时,C# 编译器会推迟编译,并将代码片段解释为表达式。将此与new Func<int, int>(hrm)始终返回Func<int, int>委托的 进行对比。