13

让我们定义这个函数:

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”。

4

3 回答 3

20

一个Boolean值永远不能是null( Nothing),可能的值是TrueFalse。您需要一个可为空的值 a Boolean?,它才能为空。

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

Public Function Test(ByVal value As Boolean?)
  Return "blabla" + If(Not value.HasValue, "", If(value.Value, "1", "0"))
End Function
于 2013-11-12T14:29:44.477 回答
8

Boolean是值类型,而不是引用类型。因此,Boolean变量的值永远不会是Nothing。如果将 aBoolean与进行比较Nothing,VB.NET 首先将转换Nothing为 a 的默认值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属性,而不是测试它是否为 ,正如我在示例中所展示的那样。

于 2013-11-12T14:31:32.737 回答
3

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

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

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

如果您想这样做,您可以更改您的签名以期望一个对象而不是布尔值。

于 2013-11-12T14:22:35.957 回答