I just shoot myself in the foot and would like to know whether there were actual reasons to make this situation possible.
And anyway, this question can stay for the convenience of the future foot shooters.
Suppose we have a nullable value in vb.net:
Dim i as Integer?
We want to assign a value to it, basing on a condition, and using a ternary operator, because it's so neat and stuff:
i = If(condition(), Nothing, 42)
That is, if a condition is true
, employ the nullability, otherwise the value.
At which point the shooting occurs. For no apparent reason VB compiler decides that the common base type for Nothing
and Integer
is Integer
, at which point it silently translates the statement to:
i = If(condition(), 0, 42)
Now, if you were to do this in C#:
i = (condition()) ? null : 42;
You would immediately get a compiler error saying that <null>
doesn't mix well with int
. Which is great, as my foot would have been healthier had I went the C# way this time. And for this to compile, you have to explicitly write:
i = (condition()) ? null : (int?)42;
Now, you can do the same in VB and get the correct null-ness you would expect:
i = If(condition(), Nothing, CType(42, Integer?))
But that requires having your foot shot in the first place. There's no compiler error and there's no warning. That's with Explicit On
and Strict On
.
So my question is, why?
Should I take this as a compiler bug?
Or can someone explain why the compiler behaves this way?
Nothing
andnull
have different meanings... it's easy to think you're doing the same thing, but you're not. – Memoirsnew Integer?
instead of nothing. It is more verbose, but it elminates confusion. – Selfwilli = If(condition(), Nothing, CType(42, Integer?))
:i.e.i = If(condition(), New Integer?, 42)
– Maecenas