问题很简单,当我在 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 conversionId 属性,即 Int32

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

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

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

关于vb.net - HasValue 给出值 0 而不是 Nothing,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50387614/

10-12 03:51