나는 종종 더 읽기 쉬운 코드를 제공하기 때문에 내 코드에서 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