为什么c#编译器输出的是表达式树而不是代码?

本文关键字:代码 表达式 编译器 输出 为什么 | 更新日期: 2023-09-27 18:02:38

代码如下:

  int[] data = new int[] { 1, 2, 3, 4, 5 };
  var q1 = data.Select(x => 10 * x);
  var q2 = data.AsQueryable().Select(x => 10 * x);
  Expression<Func<int,int>> qe = (x) => 10 * x;

在第一种情况下,编译器生成代码对表达式求值。输出中没有表达式树

在第二行中,它生成一个表达式树(在调试时可见),在运行时编译并执行该表达式树以执行查询(并且做完全相同的事情)。

在第三种情况下,与(2)相同的lambda被直接创建为表达式树(而不是代码)。

在这两种情况下,是什么使编译器生成表达式树而不是代码,还有其他有趣的情况吗?

原因:我想在运行时"挑选"表达式树的顶层,然后编译和执行较低的层次。我有麻烦让编译器做我的方式!

为什么c#编译器输出的是表达式树而不是代码?

EnumerableSelect方法接受一个Func<TSource,TResult>类型的参数。QueryableSelect方法接受一个Expression<Func<TSource,TResult>>类型的参数。

就是这么简单——如果编译器有一个lambda表达式,它要么生成表达式,要么编译lambda,这个决定是基于它被要求创建什么——如果它是某种类型的Expression,它将生成表达式树。如果是Func或其他委托类型,则生成代码。