我想在VB中用C#编写等效的代码:
bool? a = whatever;
bool b= (a==true);
VB编译器不接受以下内容:
Dim a As Boolean?
Dim b As Boolean = (a = True)
我想在这种情况下,它将(a = True)
解释为情感,而我希望将其解释为表达式。
(a == True)
显然是语法错误。
答案 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
我之所以说这是最佳实践,是因为它可以转换为所有类,而不仅仅是布尔值。请注意,这对布尔值来说是过大的杀伤力。
希望这会有所帮助。