What do two question marks together mean in C#?
Solution 1:
It's the null coalescing operator, and quite like the ternary (immediate-if) operator. See also ?? Operator - MSDN.
FormsAuth = formsAuth ?? new FormsAuthenticationWrapper();
expands to:
FormsAuth = formsAuth != null ? formsAuth : new FormsAuthenticationWrapper();
which further expands to:
if(formsAuth != null)
FormsAuth = formsAuth;
else
FormsAuth = new FormsAuthenticationWrapper();
In English, it means "If whatever is to the left is not null, use that, otherwise use what's to the right."
Note that you can use any number of these in sequence. The following statement will assign the first non-null Answer#
to Answer
(if all Answers are null then the Answer
is null):
string Answer = Answer1 ?? Answer2 ?? Answer3 ?? Answer4;
Also it's worth mentioning while the expansion above is conceptually equivalent, the result of each expression is only evaluated once. This is important if for example an expression is a method call with side effects. (Credit to @Joey for pointing this out.)
Solution 2:
Just because no-one else has said the magic words yet: it's the null coalescing operator. It's defined in section 7.12 of the C# 3.0 language specification.
It's very handy, particularly because of the way it works when it's used multiple times in an expression. An expression of the form:
a ?? b ?? c ?? d
will give the result of expression a
if it's non-null, otherwise try b
, otherwise try c
, otherwise try d
. It short-circuits at every point.
Also, if the type of d
is non-nullable, the type of the whole expression is non-nullable too.
Solution 3:
It's the null coalescing operator.
http://msdn.microsoft.com/en-us/library/ms173224.aspx
Yes, nearly impossible to search for unless you know what it's called! :-)
EDIT: And this is a cool feature from another question. You can chain them.
Hidden Features of C#?
Solution 4:
Thanks everybody, here is the most succinct explanation I found on the MSDN site:
// y = x, unless x is null, in which case y = -1.
int y = x ?? -1;
Solution 5:
The two question marks (??) indicate that its a Coalescing operator.
Coalescing operator returns the first NON-NULL value from a chain. You can see this youtube video which demonstrates the whole thing practically.
But let me add more to what the video says.
If you see the English meaning of coalescing it says “consolidate together”. For example below is a simple coalescing code which chains four strings.
So if str1
is null
it will try str2
, if str2
is null
it will try str3
and so on until it finds a string with a non-null value.
string final = str1 ?? str2 ?? str3 ?? str4;
In simple words Coalescing operator returns the first NON-NULL value from a chain.