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();
It is Null-propagating operator / Null-Conditional Operator ?. a new proposed feature in C# 6.0
x?.y?.z means
x is not null, then check y otherwise return null,y, if it is not null then return z 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
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.
this.SlimShadies.SingleOrDefault(s => s.IsTheReal)?.PleaseStandUp();
Basically.