Nullable types and the ternary operator: why is `? 10 : null` forbidden?

BFree picture BFree · May 13, 2009 · Viewed 81.8k times · Source

I just came across a weird error:

private bool GetBoolValue()
{
    //Do some logic and return true or false
}

Then, in another method, something like this:

int? x = GetBoolValue() ? 10 : null;

Simple, if the method returns true, assign 10 to the Nullableint x. Otherwise, assign null to the nullable int. However, the compiler complains:

Error 1 Type of conditional expression cannot be determined because there is no implicit conversion between int and <null>.

Am I going nuts?

Answer

LukeH picture LukeH · May 13, 2009

The compiler first tries to evaluate the right-hand expression:

GetBoolValue() ? 10 : null

The 10 is an int literal (not int?) and null is, well, null. There's no implicit conversion between those two hence the error message.

If you change the right-hand expression to one of the following then it compiles because there is an implicit conversion between int? and null (#1) and between int and int? (#2, #3).

GetBoolValue() ? (int?)10 : null    // #1
GetBoolValue() ? 10 : (int?)null    // #2
GetBoolValue() ? 10 : default(int?) // #3