我希望以下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
?
Nothing
在VB中可以应用于值类型以及引用类型,并且在所有情况下都表示"此类型的默认值".所以,例如:
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)