Home Dashboard Directory Help
Search

ternary operator reports conversion error with nullable types by dvboom


Status: 

Closed
 as By Design Help for as By Design


2
0
Sign in
to vote
Type: Bug
ID: 341263
Opened: 4/30/2008 8:32:47 AM
Access Restriction: Public
1
Workaround(s)
view
1
User(s) can reproduce this bug

Description

Using the ternary (if-then-else) operator fails when attempting to assign a null value to a nullable type. The following code fails:

bool IsGood = false;
double? DoubleVar = IsGood ? 0 : null;

But the next bit of code, which I expect would be equivalent to the previous code, successfully compiles:

bool IsGood = false;
double? DoubleVar;
if (IsGood)
    DoubleVar = 0;
else
    DoubleVar = null;
Details
Sign in to post a comment.
Posted by dvboom on 5/14/2008 at 12:00 PM
I read up on lifted operators. I think I understand why the compiler is trying to evaluate the type of this expression, to ensure that it's not assigning something invalid to the assigned variable. However, this is still an unintuitive and unexpected result. You and I know that this kind of assignment could be verified. We can see that both 0 and null are appropriate values to assign to such a nullable variable. The fact that the compiler can't tell is a limitation. So my request perhaps should have been phrased differently.

The ternary operator should be a lifted operator.

Either that, or any instance of a ternary operator should be converted into the equivalent if-then-else pattern, which would also work (though not sure what side effects that might cause, if any).

How feasible are either of these options? What is the difficulty?
Posted by Microsoft on 5/8/2008 at 3:00 PM
Hi,

Thanks for your input. We've looked into it and we think the behavior is by design. To determine the type of this expression

IsGood ? 0 : null;

the compiler compares the types of the expressions on each side of : (see section 7.13 of the spec). For the purpose of that comparison the type of 0 is int. Hence the error message.

The reason for 0 to be int and not int? is that the ternary operator is not a lifted operator (see list of lifter operators in section 7.2.7).

Please let me know if you agree/disagree with the analysis.

Regards,
Marcelo Guerra
C# Compiler QA

Posted by Microsoft on 4/30/2008 at 10:43 PM
Thanks for your feedback.

We are escalating this issue to the appropriate group within the Visual Studio Product Team for triage and resolution.
These specialized experts will follow-up with your issue.

Thank you,
Visual Studio Product Team
Sign in to post a workaround.
Posted by Daniel Smith on 5/3/2008 at 9:28 AM
You can cast the null to a nullable double and it will compile:

bool IsGood = false;
double? DoubleVar = IsGood ? 0 : (double?)null;