What does x?.y?.z mean?
The draft spec for Pattern Matching in C# contains the following code example:
Type? v = x?.y?.z;
if (v.HasValue) {
var value = v.GetValueOrDefault();
// code using value
}
I understand that Type?
indicates that Type
is nullable, but assuming x
, y
, and z
are locals, what does x?.y?.z
mean?
Be aware that this language feature is only available in C# 6 and later.
It's effectively the equivalent of:
x == null ? null
: x.y == null ? null
: x.y.z
In other words, it's a "safe" way to do x.y.z
, where any of the properties along the way might be null.
Also related is the null coalescing operator (??), which provides values to substitute for null
.
It is Null-propagating operator / Null-Conditional Operator ?. a new proposed feature in C# 6.0
x?.y?.z
means
- first, check if
x
is not null, then checky
otherwise return null, - second, when x is not null then check
y
, if it is not null then returnz
otherwise return null.
The ultimate return value will be z
or null
.
Without this operator if x
is null, then accessing x.y
would raise a Null Reference Exception, the Null-Conditional operator helps to avoid explicitly checking for null.
It is a way to avoid Null Reference Exception.
See: Getting a sense of the upcoming language features in C#
8 - Null-conditional operators
Sometimes code tends to drown a bit in null-checking. The null-conditional operator lets you access members and elements only when the receiver is not-null, providing a null result otherwise:
int? length = customers?.Length; // null if customers is null