クエリ理解コードは次のとおりです。
from f1 in e1
from f2 in e2
from f3 in e3
select f3
メソッド呼び出しコードは次のとおりです。
e1
.SelectMany(f1 => e2)
.SelectMany(f2 => e3), (f2, f3) => f3))
クエリの翻訳は次のように進行します。最初に、最初の2つの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を上記の実際の構文変換に代入すると、結果の式は型推論に合格しますか?
そうでない場合、問題は「なぜそうではないのか」です。コードに問題があるか、型推論器に問題があります。タイプ推論機能に問題がある場合は、お知らせください。
もしそうなら、質問は「構文変換パスの何が問題になっているのか」です。構文変換パスに問題がある場合は、もう一度お知らせください。
ありがとう!