IF()函数和可以为空的整数错误的结果?

时间:2009-12-01 19:03:12

标签: vb.net

我希望以下vb.net函数返回Nothing的值,而是返回值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

该函数的最后一行也可以写成Return If(IsNothing(tsrvDict) OrElse tsrvDict.Count = 0, Nothing, tsrvDict.First.Key),但无论如何,为什么IF()函数If(IsNothing(tsrvDict) OrElse tsrvDict.Count = 0, Nothing, tsrvDict.First.Key)返回0而不是Nothing }?

2 个答案:

答案 0 :(得分:13)

VB中的

Nothing可以应用于值类型和引用类型,并且在所有情况下都意味着“此类型的默认值”。所以,例如:

Dim x As Integer = Nothing
Console.WriteLine(x) ' 0

对于If()运算符,VB必须以某种方式推导出返回类型。它查看两个分支,并找出它们最近的常见类型。在这种情况下,一个分支是Integer类型。另一个是Nothing,它是“无类型的”,但它与Integer兼容,正如我们之前看到的那样。因此,If()的结果类型推断为Integer。在该上下文中返回Nothing时,它变为0。

显式演员会解决这个问题:

GetDefaultTipoSrvTkt = If( _
    IsNothing(tsrvDict) OrElse tsrvDict.Count = 0, _
    CType(Nothing, Integer?), _
    tsrvDict.First.Key)

或者您可以使用另一种方法为可空类型指定空值:

GetDefaultTipoSrvTkt = If( _
    IsNothing(tsrvDict) OrElse tsrvDict.Count = 0, _
    New Integer?(), _ 
    tsrvDict.First.Key)

答案 1 :(得分:0)

我认为Rodolfo已经简化了真正的代码来提出一个简短的问题,这当然是一个好主意。但这有点奇怪。

  • Dim x As New YequivalentDim x As Y: x = New Y,因此每次执行语句时都会创建一个新字典。所以函数总是返回Nothing,字典永远不会得到任何条目,并在函数返回时立即超出范围。

Pavel的answer可能是最有帮助的。但它足够复杂,我只会写一个正常的If语句

If tsrvDict Is Nothing OrElse tsrvDict.Count = 0 Then  
  Return Nothing  
Else   
  Return tsrvDict.First.Key   
End If