Consider the following code:
IEnumerable xx = null;
var tt = xx?.Where(x => x > 2).Select(x => x.ToString());
It assign
The null-conditional operator or also known as the null propagation operator is short-circuiting i.e if one operation in the chain:
var tt = xx?.Where(x => x > 2).Select(x => x.ToString());
returns null
, then the rest of the chain’s execution stops.
So in the above example Where
is never invoked as xx
is null
.
As for the second example, you're getting an ArgumentNullException
because that's the behaviour of extension methods. in this specific case, the Select
throws a ArgumentNullException
when the source or the provided selector is null
.
Yes, this is due to short-circuiting. From the MSDN reference:
...[T]he null-condition operators are short-circuiting. If one operation in a chain of conditional member access and index operation returns null, then the rest of the chain’s execution stops.
The reason your second example throws is because you have separate unchained statements. Short-circuiting cannot be applied across multiple statements.