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 conversionId-属性也就是Int32.

如果你想要 Nullable(Of Int32) 使用:

Return Query(if(CustomClass IsNot Nothing, CustomClass.Id, New Int32?()))

因为我提到了 C#,如果你在那里尝试相同的操作,你会得到一个编译器错误,即 nullint 之间没有隐式转换。在VB.NET里面有一个,默认值0。