c# - Conditional Operator ?: with Nullable type Casting

ID : 274503

viewed : 31

Tags : c#.netc#





Top 5 Answer for c# - Conditional Operator ?: with Nullable type Casting

vote vote

100

null can represent any object-based datatype. You need to cast null as a datatype so it know what you are talking about.

int? x = (value.HasValue) ? value.Value : (int?)null; 

I know, it sounds a bit strange.


To answer the questions in the comments:

Why is it not implicit though?
Yeah, I get that. But why do I not have to cast it in a If Else block?

Let's walk through the code.

Your else statement looks like this:

else x = null; 

This means you are assigning the value of null to x. This is valid, because x is a int?, which takes nulls.

The difference comes when you have the ternary operator. It says: "assign the value of the operator into x". The question (and the reason for your error) is, what datatype is the result of the ternary operator?

From your code, you can't be sure, and the compiler throws its hands up.

int? x = (value.HasValue) ? value.Value : null; // int?        bool             int        ?? 

What datatype is null? You are quick to say "well it's a int?, because the other side is a int and the result is a int?". The problem is, what about the following:

string a = null; bool? b = null; SqlConnectionStringBuilder s = null; 

This is also valid, which means null can be used for any object-based datatype. This is why you have to explicitly cast null as the type you want to use, because it can be used for anything!


Another explanation (and possible more accurate):

You can't have an implicit cast between a nullable and a non-nullable value.

int is not-nullable (it's a structure), where null is. This is why in Habib's answer you can put the cast on either the left or right side.

vote vote

87

For Condtional operator MSDN states:

Either the type of first_expression and second_expression must be the same, or an implicit conversion must exist from one type to the other.

So in you case your first_expression and second_expression are:

int? x = (value.HasValue) ? value.Value : null;                              ^^^^^^^^      ^^^^^                              first exp     2nd Exp 

Now if you see, your First Expression is of type int, and second expression is null and both are not same and there is no implicit conversion. So casting any of them to `int? solves the problem.

So:

int? x = (value.HasValue) ? (int?) value.Value : null; 

Or

int? x = (value.HasValue) ? value.Value : (int?) null; 

are fine.

Now why it is not required with if-else, because there multiple statements involved and it not a single statement assigning the value.

vote vote

73

var x = value.HasValue ? value.Value : default(int?); 

works too.

vote vote

65

The documentation for the ?: operator states that the type of the expression b ? x : y is determined by examining the types of x and y:

  • If X and Y are the same type, then this is the type of the conditional expression.
  • Otherwise, if an implicit conversion (Section 6.1) exists from X to Y, but not from Y to X, then Y is the type of the conditional expression.
  • Otherwise, if an implicit conversion (Section 6.1) exists from Y to X, but not from X to Y, then X is the type of the conditional expression.
  • Otherwise, no expression type can be determined, and a compile-time error occurs.

In your example

int? x = (value.HasValue) ? value.Value : null; 

there is no implicit conversion between int and null so the last bullet applies.

vote vote

52

The reason is that the type of conditional expression is determined by the second and third operators of the conditional operator (?:) .

Since null has no type, the compiler cannot determine the type of the overall expression so it emits a compiler error.

The reason it works with the simple assignment operator (=) is because the left side of the operator determines the the type. Since in the If statement, the type of x is already known, the compiler doesn't complain.

See section 7.14 (Conditional operator) and section 7.17.1 (Simple assignment) for further explanations.

Top 3 video Explaining c# - Conditional Operator ?: with Nullable type Casting







Related QUESTION?