您查询综合代码为:
from f1 in e1
from f2 in e2
from f3 in e3
select f3
你的方法调用的代码是:
e1
.SelectMany(f1 => e2)
.SelectMany(f2 => e3), (f2, f3) => f3))
查询翻译过程如下。首先,我们应对前两个FROM子句:
from f1 in e1
from f2 in e2
from f3 in e3
select f3;
这被翻译成
from x in (e1) . SelectMany(f1 => e2 , (f1 , f2) => new { f1 , f2 })
from f3 in e3
select f3;
其中 “X” 是一个透明的标识符。由于e1,e2或e3都不使用任何范围变量,因此这是一个透明标识符的事实是不相关的;不需要进一步重写来处理透明标识符语义。
这一结果,然后转化为
((e1) . SelectMany(f1 => e2 , (f1 , f2) => new { f1 , f2 }))
.SelectMany(x => e3 , (x , f3) => f3)
我们可以消除一些人的括号:
e1
.SelectMany(f1 => e2 , (f1 , f2) => new { f1 , f2 }))
.SelectMany(x => e3 , (x , f3) => f3)
显然,这是从语法变换你手工完成,其中,召回而不同,是
e1
.SelectMany(f1 => e2)
.SelectMany(f2 => e3), (f2, f3) => f3))
如果您将e1,e2,e3替换为实际值上面的语法转换,得到的表达式传递类型推断?
如果没有,那么问题是“为什么不?”你的代码有问题,或者类型推理器有问题。如果类型推理者出现问题,请告诉我。
如果是这样,那么问题是“句法转换过程有什么问题”?如果语法转换过程有问题,请再告诉我。
谢谢!
编译器用于翻译查询表达式的精确系列步骤是在C#规范中,您可以从Internet获得该规范。 – 2009-12-07 16:34:13