C#编译器看到Fluent语法还是Query Expression?

Roy*_*mir 4 c# linq .net-4.0

我总是对这些东西感到困惑.

我有这个问题:

string[] names = { "Tom", "Dick", "Harry", "Mary", "Jay" };

IEnumerable<string> query = names.Where(n => n.Contains("a"))
.OrderBy(n => n.Length)
.Select(n => n.ToUpper());
Run Code Online (Sandbox Code Playgroud)

我在一本书中读过:

编译器通过将查询表达式转换为流畅语法来处理查询表达式

但在Reflector我看到相反的情况: 反射器代码

这不是流利的语法.

那么编译器看到了什么?

Eri*_*ert 19

根据定义,"编译器"是将用一种语言编写的文本翻译成另一种语言的设备.

C#编译器将包含查询表达式的C#程序逻辑转换为C#-without-query-expressions,然后将这些程序转换为IL.(注意,它实际上不需要执行转换的中间阶段;它必须表现得像它一样,但如果编译器编写者足够聪明地跳过那个中间步骤并仍然得到正确的输出,那么我们当然可以这样做.)

Reflector也是一个编译器.它将IL转换为C#.它如何做到这一点是它的业务.

你不能根据Reflector的输出得出关于C#编译器做什么的任何结论; 它们是由不同的人编写的完全不同的程序,以解决不同的问题.


SLa*_*aks 6

查询理解语法直接编译为方法调用; 他们产生难以区分的IL.

但是,许多反编译器总是将LINQ调用转换为查询理解语法.
你可以在选项中改变这种行为.

  • @RoyiNamir:在ildasm中,或者在Reflector中禁用该选项. (2认同)