Why can't I use the null propagation operator in lambda expressions?
It's complicated since expression tree lambdas (unlike delegate lambdas) are interpreted by already existing LINQ providers which don't yet support null propagating.
Converting to a conditional expression is not always accurate as there are multiple evaluations while with
?. there's only a single evaluation for example:
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
You can go deeper in the relevant discussion on CodePlex where 3 solutions are offered:
ConditionalExpression & a hybrid
Related videos on Youtube
Mohsen Sarkar about 2 years
I often use null propagating operator in my code because it gives me more readable code, specially in long queries I don't have to null-check every single class that is used.
The following code throws a compile error that we can't use null propagating operator in lambda.
var cnt = humans.AsQueryable().Count(a => a.House?.Price == 5000);
The error :
Error CS8072 An expression tree lambda may not contain a null propagating operator.
C# Could easily translate above code to the code to following code if really can't do anything else!
var cnt = humans.AsQueryable().Count(a => a.House != null && a.House.Price == 5000);
I'm curious why C# does nothing and simply throws a compiler error?
Lucas Trzesniewski over 7 years
Foo?.Baris not equivalent to
Foo != null ? Foo.Bar : nullbecause
Foois evaluated once with the null-propagating operator, and twice with the conditional, so the translation wouldn't be correct in all cases.
xanatos over 7 yearsNote that if its code for EF, there is the possibility that you don't really need the null propagating operator, because when a query is converted to SQL call, SQL doesn't throw nulls :-)