[c#] 람다 식에서 null 전파 연산자를 사용할 수없는 이유는 무엇입니까?

나는 종종 더 읽기 쉬운 코드를 제공하기 때문에 내 코드에서 null 전파 연산자를 사용합니다. 특히 긴 쿼리에서는 사용되는 모든 단일 클래스를 null 검사 할 필요가 없습니다.

다음 코드는 람다에서 null 전파 연산자를 사용할 수 없다는 컴파일 오류를 발생시킵니다.

var cnt = humans.AsQueryable().Count(a => a.House?[0].Price == 5000);

오류 :

오류 CS8072 식 트리 람다에 null 전파 연산자가 포함될 수 없습니다.

C #은 정말로 다른 것을 할 수 없다면 위의 코드를 다음 코드로 쉽게 변환 할 수 있습니다!

var cnt = humans.AsQueryable().Count(a => a.House != null && a.House[0].Price == 5000);

왜 C #이 아무 일도하지 않고 컴파일러 오류를 던지는 이유가 궁금합니다.



답변

식 트리 람다 (대리자 람다와 달리)는 아직 null 전파를 지원하지 않는 기존 LINQ 공급자에 의해 해석되기 때문에 복잡합니다.

조건식으로 변환하는 것이 항상 정확한 것은 아닙니다 ?.. 예를 들어 단일 평가 만있는 동안 여러 평가가 있기 때문입니다.

customer.Where(a => c.Increment()?.Name) // Written by the user 
customer.Where(a => c.Increment() == null ? null : c.Increment().Name) // Incorrectly interpreted by an old LINQ provider

3 가지 솔루션이 제공되는 CodePlex 에 대한 관련 토론에서 더 깊이 들어갈 수 있습니다 : NullPropagationExpression, ConditionalExpression& a hybrid


답변