以下編譯在VB.NET(有選項嚴格ON)和輸出False
:爲什麼VB.NET中的三元運算符接受可空布爾值?
Dim b As Boolean? = Nothing
Dim myString = If(b, "True", "False")
爲什麼工作?
The documentation明確指出的
If
三個參數版本需要Boolean
作爲第一個參數:參數1必需。布爾。確定要評估和返回哪些其他參數。
並沒有隱式轉換從
Boolean?
到Boolean
:Dim b1 As Boolean? = Nothing Dim b2 As Boolean = b1 ' Fails with the following error: ' Option Strict On disallows implicit conversions ' from 'Boolean?' to 'Boolean'.
那麼,爲什麼這項工作?它是編譯器中的錯誤(或「隱藏功能」),還是文檔中的錯誤,Boolean?
實際上是第一個參數If(a, b, c)
的有效類型?
PS:在C#,b ? x : y
確實不編譯如果b
是bool?
類型。
編輯:我reported this issue to Microsoft Connect。來自MS的某人已回覆並確認文檔將更新爲包含Boolean?
的情況。
它真的使用IIF嗎? (注意兩個我)? –
好的。我的Reflector被設置爲.Net 2.0,它沒有VB'IF'三元運算符。更新到4.0使得它'IF'而不是'IFF'。很明顯,這是Reflector嘗試從IL重建VB.Net。實際的IL命令是「brtrue.s」,它是「分支如果爲真」,這是三元操作通常轉換成的。 –