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作为表达式树(而不是代码)。
在这两种情况下,什么使编译器生成表达式树而不是代码,还有其他有趣的情况吗?
原因:我想在运行时“分离”表达式树的顶层,然后编译并执行较低层。我无法让编译器按我的方式做事!
这是“编译器如何编写”的一个例子。它需要这样做才能使表达式工作。这就好像返回'IEnumerable'的方法''可以使用'yield return'。支持语言功能的特殊编译器操作。 –
Enigmativity
名单继续。编译器会以不同的方式处理'Nullable'类型。它可以为'foreach'循环使用duck-typing。 LINQ查询实际上只是重新排列的方法(通常是扩展方法,但不需要)。 “使用”陈述仅适用于一次性用品等。 –
Enigmativity
您的第一个陈述并非真正的表达;它是一个*构造函数调用。*两个Select语句是Linq语句,它们作为其正常操作的一部分生成表达式。第四个语句生成一个表达式,因为您将表达式指定为结果类型。 –