您查詢綜合代碼爲:
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