让我们定义这个函数:
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”。
答案 0 :(得分:17)
Boolean
值永远不能为null
(Nothing
),可能的值为True
和False
。您需要一个可以为空的值Boolean?
,因为它可以为空。
使用可空值的HasValue
和Value
属性来检查是否有值,并获取值:
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
。如果您将Boolean
与Nothing
进行比较,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而不是布尔值。