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<>”可以转换为表达式?
我认为您的困惑来自于 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>委托的 进行对比。