J.S*_*eve 2 vb.net nullable ternary-operator
dim val1 As Integer? = If(5 > 2, Nothing, 43)
' val1 = 0
dim val1 As Integer? = If(5 > 2, Nothing, Nothing)
' val1 = Nothing
Run Code Online (Sandbox Code Playgroud)
是什么赋予了?这是一个错误,还是我忽略了什么?
Ada*_*ras 13
问题是NothingVB.NET的工作方式与nullC#不同.在Nothing值类型(例如Integer)的上下文中使用时,它表示该类型的默认值.在这种情况下,那是0.
在第一个示例中,三元运算符的两个分支都是有效值Integer.true分支代表0,false分支代表43.
在第二个示例中,三元运算符的任何分支都不是有效值Integer,因此强制VB.NET编译器假定整个运算符返回Object,而不是Integer.
为了使第一个示例以您想要的方式工作,您需要向编译器明确说明三元运算符应该解析为a Integer?,而不是an Integer或an Object.你可以这样做:
dim val1 As Integer? = If(5 > 2, Nothing, New Integer?(43))
Run Code Online (Sandbox Code Playgroud)
通过显式地使运算符的假分支成为一个Integer?,Nothing真正的分支中的代表空值而不是默认Integer值.