如何将布尔值的结果影响到布尔值?表达

时间:2019-01-17 08:54:25

标签: vb.net nullable

我想在VB中用C#编写等效的代码:

bool? a = whatever;
bool b= (a==true);

VB编译器不接受以下内容:

Dim a As Boolean?
Dim b As Boolean = (a = True)

我想在这种情况下,它将(a = True)解释为情感,而我希望将其解释为表达式。  (a == True)显然是语法错误。

3 个答案:

答案 0 :(得分:3)

您可以使用GetValueOrDefault方法:

Dim a As Boolean?
Dim b As Boolean = a.GetValueOrDefault()

答案 1 :(得分:0)

您也可以使用CBool

Dim a As Boolean?
Dim b As Boolean = CBool(a = True)

答案 2 :(得分:-1)

您需要注意0,Nothing和vbNull之间的差异。 0是布尔值的默认值。 vbNull是保留的Null值,应转换为1。 在几乎所有情况下都不会抛出异常

Dim a As Boolean? = Nothing
Dim b As Boolean? = vbNull
Dim c As Boolean = vbNull
Dim d As Boolean

Print(a = True) 'will throw an Exception
Print(b = True) 'will return True (as vbNull = Int(1))
Print(c = True) 'will return True as the ? is unnecessary on a Boolean as vbNull = Int(1)
Print(d = True) 'will return False as the default value of a Boolean is 0
Print(a.GetValueOrDefault) 'will return False as this handles the Nothing case.

使用未分配的值时,您应该始终先检查“无”(或遵循良好做法并在使用前设置值)。

    Dim a As Boolean?
    Dim b As Boolean = IIf(IsNothing(a), False, a)

如果a为Nothing,则返回False,否则返回A。

仅在测试了Nothing之后,您才能测试vbNull,因为Nothing不会在所有值上返回错误。如果Nothing或vbNull,否则下面的代码将返回False。

    Dim a As Boolean?
    Dim b As Boolean = IIf(IsNothing(a), False, IIf(a = vbNull, False, a))

注意:您不能使用下面的代码,因为测试a = vbNull将针对Nothing,否则将引发异常。

Or(IsNothing(a), a = vbNull) 

我还将避免在任何实际应用程序中使用GetValueOrDefault,因为当您开始使用更复杂的数据类型时,默认值将不会如此简单,并且您会得到意想不到的结果。恕我直言,测试IsNothing(或Object = Nothing,Object Is Nothing)比依赖数据类型的古怪要好得多。

最佳做法是确保a具有您可以使用的值

    Dim a As Boolean? = New Boolean()
    Dim b As Boolean = a

我之所以说这是最佳实践,是因为它可以转换为所有类,而不仅仅是布尔值。请注意,这对布尔值来说是过大的杀伤力。

希望这会有所帮助。