vb.net布尔值和无

时间:2013-11-12 14:20:32

标签: .net vb.net boolean nothing

让我们定义这个函数:

Public Function Test(ByVal value As Boolean)
    Return "blabla" + If(value = Nothing, "", If(value, "1", "0"))
End Function

我希望它能够执行以下操作: Test(True) -> "blabla1"Test(False) -> "blabla0"Test(Nothing) -> "blabla"

问题是Test(Nothing)返回“blabla0”。

3 个答案:

答案 0 :(得分:17)

Boolean值永远不能为nullNothing),可能的值为TrueFalse。您需要一个可以为空的值Boolean?,因为它可以为空。

使用可空值的HasValueValue属性来检查是否有值,并获取值:

Public Function Test(ByVal value As Boolean?)
  Return "blabla" + If(Not value.HasValue, "", If(value.Value, "1", "0"))
End Function

答案 1 :(得分:7)

Boolean是值类型,而不是引用类型。因此,Boolean变量的值永远不会是Nothing。如果您将BooleanNothing进行比较,VB.NET会先将Nothing转换为Boolean的默认值,即False,然后对其进行比较那个。因此,测试以查看Boolean变量Is Nothing是否与测试有效,以确定它是否等于False。如果您需要Boolean可以设置为Nothing,则需要将其设为Nullable(Of Boolean)。不过,有一条捷径。要使任何值类型为可空,您只需在类型后面添加一个问号,如下所示:

Public Function Test(ByVal value As Boolean?)
    Return "blabla" + If(value.HasValue, If(value.Value, "1", "0"), "")
End Function

正如您将注意到的,即使变量可以为空,您仍然不会通过将变量与Nothing进行比较来测试它是否为空。这可能会让人感到惊讶,但Nullable(Of T)实际上也是一种值类型。因此,正如我在示例中演示的那样,您应该使用它的Nothing属性,而不是测试它是否为HasValue

答案 2 :(得分:2)

在对Nothing进行测试时,您需要使用Is关键字,但是您无法将值作为布尔值传递,因为它仅适用于引用类型。

If( value Is Nothing, "", If( value, "1", "0" ) )

值得注意的是,如果Nothing不是引用类型,则Nothing默认为默认值。

如果要执行此操作,可以更改签名以期望使用Object而不是布尔值。