vb.net布尔值和无

Art*_*Rey 12 .net vb.net boolean nothing

我们来定义这个函数:

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

我希望它做到以下几点: Test(True) -> "blabla1",Test(False) -> "blabla0",Test(Nothing) -> "blabla".

问题是Test(Nothing)返回"blabla0".

Guf*_*ffa 18

Boolean值不能null(Nothing),即是可能的值是TrueFalse.你需要一个可以为null的值,Boolean?因为它可以为null.

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

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


Ste*_*art 7

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

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

正如您将注意到的,即使变量可以为空,您仍然不会通过比较它来测试它是否为null Nothing.它可能会出乎意料,但Nullable(Of T)实际上也是一种价值类型.因此,正如我在示例中演示的那样Nothing,您应该使用它的HasValue属性,而不是测试它是否存在.