问题很简单,当我在 Nothing
方法的末尾将 Run
的 CustomClass 传递给 Query
方法时, second.HasValue
显示 0
。不应该是 Nothing
吗?
Public Function Run() As Boolean
Return Query(if(CustomClass IsNot Nothing, CustomClass.Id, Nothing))
End Function
Public Function Query(second As Integer?) As Boolean
...
If second.HasValue Then
'value = 0 !
Else
'some query
End If
...
End Function
最佳答案
这是 VB.NET 的一个奇怪之处。 Nothing
不仅表示 null
(C#) 还表示 default
(C#) 。所以它将返回给定类型的默认值。为此,您甚至可以将 Nothing
分配给 Integer
变量(或任何其他引用或值类型)。
在这种情况下,编译器决定 Nothing
表示 Integer
的默认值是 0。为什么?因为他需要找到 implicit conversion 到 Id
属性,即 Int32
。
如果你想要一个 Nullable(Of Int32)
使用:
Return Query(if(CustomClass IsNot Nothing, CustomClass.Id, New Int32?()))
因为我提到了 C#,如果你在那里尝试同样的方法,你会得到一个编译器错误,即
null
和 int
之间没有隐式转换。在 VB.NET 中有一个,默认值为 0。关于vb.net - HasValue 给出值 0 而不是 Nothing,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50387614/