最有可能这是一个错误报告,而不是问问题,但是,如果不是这样,任何人都知道原因,请解决这个悖论。
函数driver.findElement(By.xpath(".//aside//div//ul//li[2]//a//span")).click();
在MSDN中明智地描述的所有情况下都不起作用。如果IF(arg1, arg2, arg3)
为arg2
,则在特殊情况下不会返回Nothing
,尤其是当Nothing
为arg1
时TRUE
为{{} 1}})和arg2
不属于可空类型。相反,它会将Nothing
转换为arg3类型(为arg3
设置默认值Nothing
类型)并将该值传递给arg3
。下面的代码说明了问题\ question \ bug
评论意味着行为,消息标题有助于遵循(如果序列丢失)
arg2
答案 0 :(得分:2)
在VB.NET中,Nothing
有两个含义:
null
(如在C#中)default
)如果使用两种类型的条件运算符,则它们必须可以相互转换。使用Nothing
和True
是可能的,因为Boolean
的默认值为False
。
所以它与较长版本相同
Dim bool1 As Boolean = Nothing ' False
Dim bool2 As Boolean = If(True, bool1, True)
bool2
将为False
,因为bool1
为False
,因为这是Boolean
的默认值。
你从中学到了什么?小心If
运算符和隐式转换,并始终记住Nothing
不仅仅意味着VB.NET中的null
。
另请注意,Boolean
之类的值类型始终具有值,它们永远不会null
。在这种情况下,Nothing
实际上意味着“给我默认值”。
现在练习:)这里的整数i
的结果是什么?
Dim i AS int32 = If(true, nothing, 777)
答案 1 :(得分:2)
可以将If
运算符视为通用函数:
If(Of T)(condition As Boolean,
truePart As T,
falsePart As T) As T
这意味着第二个和第三个参数必须是相同的类型(显式或一个可以作为另一个转换),返回值将是相同的类型。考虑到这一点,让我们看看你的一些例子。
'2nd msgbox. If(D, Nothing, True) returns false instead of nothing
MsgBox(If(D, Nothing, True), vbOK, "'2nd msgbox.")
所以,为了那个工作,第二个和第三个作为相同的类型。那可能是什么类型的?第二个参数的类型未指定,而第三个参数的类型为Boolean
。 Nothing
可以转换为类型Boolean
,这样就会发生什么,因此返回值也是Boolean
。将Nothing
转换为类型Boolean
会产生False
,因此第二个参数实际上是False
,这就是返回的内容。
Dim UnevaluatedPart As Nullable(Of Integer)
' 8th. Now it returns nothing with integer? as third argument (false part)
MsgBox(If(True, Nothing, UnevaluatedPart), vbOK, "8th. Now it returns nothing")
' 9th. Proof of above (it's really nothing not empty string ""
MsgBox(If(True, Nothing, UnevaluatedPart) Is Nothing, vbOK, "' 9th. Proof of above")
在这两种情况下,第二个参数的类型都未指定,第三个参数的类型为Integer?
,因此Nothing
会被转换为类型Integer?
。这意味着第二个和第三个参数都是Integer?
,没有任何值。无论条件是True
还是False
,您都将获得相同的返回值。当然它不会是空的String
,因为返回值必须是类型Integer?
。不仅仅是Nothing
;它是一个没有值的Integer?
,因此您可以实际测试该结果的HasValue
属性。
' 5th. this returns different result (int format) but again not the expected nothing
MsgBox(If(True, Nothing, 15), vbOK, "5th.")
同样,第二个参数的类型未指定,因此参数和返回类型是从第三个参数推断出来的。第三个参数是类型Integer
,这意味着Nothing
被转换为类型Integer
,它产生零。条件是True
,因此返回零值。如果你测试了它是否等于Nothing
那么你会发现它是,这正是为什么Nothing
转换为第二个参数的原因。
答案 2 :(得分:0)
“如果”需要返回值,当它查看参数并看到没有布尔值时,它会显示“哦,我应该返回一个布尔值”。如果要返回一个可空的布尔值,那么其中一个参数需要是一个布尔值?与整数相同。
Dim a As Boolean? = If(True, Nothing, True)
Dim b As Boolean? = If(False, Nothing, True)
Dim c As Boolean? = If(True, Nothing, CType(True, Boolean?))
Dim d As Boolean? = If(False, Nothing, CType(True, Boolean?))
Console.WriteLine(a) ' false
Console.WriteLine(b) ' true
Console.WriteLine(c) ' empty
Console.WriteLine(d) ' true