我希望以下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
}?
答案 0 :(得分:13)
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 Y
是equivalent到Dim 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