tags:

views:

351

answers:

7

Possible Duplicate:
What do two question marks together mean in C#?

I'm trying to understand what this statment does: what does "??" mean? is this som type if if-statment?

string cookieKey = "SearchDisplayType" + key ?? "";
+5  A: 

It's this. Well, not really.

Actually, it's this. And this, this, this and this, to name a few. I used almighty Google to find them, since SO has no function to search in the answers (correct?), thus making it hard to find duplicates to this kind of question. Well, for the future, use this as reference. ;-)

It's called the null-coalescing operator. It's basically the same as

int? nullableDemoInteger;
// ...
int someValue = nullableDemoInteger ?? -1;
// basically same as
int someValue = nullableDemoInteger.HasValue ? nullableDemoInteger.Value : -1;
// basically same as
int someValue;
if(nullableDemoInteger.HasValue)
    someValue = nullableDemoInteger.Value;
else
    someValue = -1;
Martin
+1 the best usage of ?? is nullable types imo
abatishchev
+2  A: 

Its called null-coalescing operator. See: http://msdn.microsoft.com/en-us/library/ms173224.aspx

MrDosu
+12  A: 

It's the Null Coalescing operator. It means that if the first part has value then that value is returned, otherwise it returns the second part.

E.g.:

object foo = null;
object rar = "Hello";

object something = foo ?? rar;
something == "Hello"; // true

Or some actual code:

IEnumerable<Customer> customers = GetCustomers();
IList<Customer> customerList = customers as IList<Customer> ?? 
    customers.ToList();

What this example is doing is casting the customers as an IList<Customer>. If this cast results in a null, it'll call the LINQ ToList method on the customer IEnumerable.

The comparable if statement would be this:

IEnumerable<Customer> customers = GetCustomers();
IList<Customer> customersList = customers as IList<Customer>;
if (customersList == null)
{
     customersList = customers.ToList();
}

Which is a lot of code compared to doing it within a single line using the null-coalescing operator.

GenericTypeTea
just one point -> you cannot do `var foo = null;`
Yossarian
@Yossarian - Yeah, good point, but it was just pseudo code. I changed it to avoid confusion.
GenericTypeTea
@Yossarian - You can do `var foo = (object)null;` or `var foo = (SomeClass)null;` which will help keep variable names lined up and code easy to read.
Enigmativity
+1  A: 

This is the Null Coalescing operator which checks if the value is null and returns the value after the ?? if it is.

Peter
+1  A: 

Its the null-coalescing operator.

This means that if key is not null, it uses the value of key, If key is null, it uses the value "".

Øyvind Bråthen
+4  A: 

It's the null-coalescing operator. In this case it's roughly equivalent to:

string cookieKey;
string temp = "SearchDisplayType" + key;
if (temp == null)
    cookieKey = "";
else
    cookieKey = temp;

And, since "SearchDisplayType" + key can never be null, this is exactly equivalent to:

string cookieKey = "SearchDisplayType" + key;
LukeH
+1. Beat me to it. Only answer so far that mentions the precedence of `??` vs `+` and that it is redundant in the OP's example.
Ani
Wrong. If (key == null) not if ("SearchDisplayType" + key) == null).
Goran
@Goran: No, LukeH is correct. Perhaps its not intuitive, but test it out.
Ani
@Goran: Why don't you actually try it before downvoting?
LukeH
I did. int? y = null; string x = "test" + y ?? ""; yields "test" not "".
Goran
I see why - can you edit the answer a bit (my vote is locked)?
Goran
+1  A: 

?? is the null-coalescing.

From MSDN:

The ?? operator is called the null-coalescing operator and is used to define a default value for a nullable value types as well as reference types. It returns the left-hand operand if it is not null; otherwise it returns the right operand.

Note, however, that in your case the left part of the expression cannot be null, beacuse it's a concatenation of string constant with a variable. If key is null, then "SearchDisplayType" + key evaluates to "SearchDisplayType".

I guess the intent of your statement could be implemented with:

string cookieKey = key==null ? "" : "SearchDisplayType"+key;

using this code, cookieKey is set to empty string if key is null, otherwise is set to the concatenation of "SearchDisplayType"+key

Andrea Parodi