I would expect the following vb.net function to return a value of Nothing
, but instead its returning a value of 0
...
Public Shared Function GetDefaultTipoSrvTkt() As Integer?
Dim tsrvDict As New Dictionary(Of Integer, DataRow)
GetDefaultTipoSrvTkt = If(IsNothing(tsrvDict) OrElse tsrvDict.Count = 0, Nothing, tsrvDict.First.Key)
End Function
The last line of the function could also be written as Return If(IsNothing(tsrvDict) OrElse tsrvDict.Count = 0, Nothing, tsrvDict.First.Key)
but in any case, why is the IF()
function If(IsNothing(tsrvDict) OrElse tsrvDict.Count = 0, Nothing, tsrvDict.First.Key)
returning 0
instead of Nothing
?
Nothing
in VB can be applied to value types as well as reference types, and in all cases means "default value of this type". So, for example:
Dim x As Integer = Nothing
Console.WriteLine(x) ' 0
For If()
operator, VB has to deduce the return type somehow. It looks at both branches, and figures out the nearest common type for them. In this case, one branch is of type Integer
. Another is Nothing
, which is "typeless", but it is compatible with Integer
, as we saw earlier. Therefore, the result type of If()
is deduced to be Integer
. When Nothing
is returned in that context, it becomes 0.
An explicit cast will fix this:
GetDefaultTipoSrvTkt = If( _
IsNothing(tsrvDict) OrElse tsrvDict.Count = 0, _
CType(Nothing, Integer?), _
tsrvDict.First.Key)
or you can use an alternative way to specify the null value for a nullable type:
GetDefaultTipoSrvTkt = If( _
IsNothing(tsrvDict) OrElse tsrvDict.Count = 0, _
New Integer?(), _
tsrvDict.First.Key)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With