조회 이해의 코드는 다음과 같습니다
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 f1 in e1
from f2 in e2
from f3 in e3
select f3;
이이
"x"는 투명한 식별자
from x in (e1) . SelectMany(f1 => e2 , (f1 , f2) => new { f1 , f2 })
from f3 in e3
select f3;
로 변환됩니다. 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# 사양에 있습니다. –