HasValue 给出值 0 而不是 Nothing
HasValue giving value 0 instead of Nothing
问题很简单,当我将 Nothing
的 CustomClass 传递给 Run
方法时,最后在 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
原因是内联 If
语句。
它将 return 一个 Integer
而不是 Integer?
因为 CustomClass.Id
显然是 Integer
.
类型
因此您可以将 CustomClass.Id
定义为 Integer?
或使用 CType
将其转换为内联 If
.[=21= 中的 Integer?
]
Public Function Run() As Boolean
Return Query(if(CustomClass IsNot Nothing, CType(CustomClass.Id, Integer?), Nothing))
End Function
这 VB.NET 很奇怪。 Nothing
doesn't only mean null
(C#) but also default
(C#)。所以它将 return 给定类型的默认值。出于这个原因,您甚至可以将 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。
问题很简单,当我将 Nothing
的 CustomClass 传递给 Run
方法时,最后在 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
原因是内联 If
语句。
它将 return 一个 Integer
而不是 Integer?
因为 CustomClass.Id
显然是 Integer
.
因此您可以将 CustomClass.Id
定义为 Integer?
或使用 CType
将其转换为内联 If
.[=21= 中的 Integer?
]
Public Function Run() As Boolean
Return Query(if(CustomClass IsNot Nothing, CType(CustomClass.Id, Integer?), Nothing))
End Function
这 VB.NET 很奇怪。 Nothing
doesn't only mean null
(C#) but also default
(C#)。所以它将 return 给定类型的默认值。出于这个原因,您甚至可以将 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。