dim val1 As Integer? = If(5 > 2, Nothing, 43)
' val1 = 0
dim val1 As Integer? = If(5 > 2, Nothing, Nothing)
' val1 = Nothing
是什么给出的?这是一个错误,还是我忽略了什么?
答案 0 :(得分:13)
问题是VB.NET中的Nothing
与C#中的null
的工作方式不同。在值类型(例如Nothing
)的上下文中使用Integer
时,它表示该类型的默认值。在这种情况下,那是0。
在第一个示例中,三元运算符的两个分支都是有效的Integer
值。 true分支代表0,false分支代表43。
在第二个示例中,三元运算符的任何分支都不是有效的Integer
值,因此强制VB.NET编译器假设整个运算符返回Object
,而不是Integer
要使第一个示例以您想要的方式工作,您需要向编译器明确说明三元运算符应解析为Integer?
,而不是Integer
或{{1} }。你可以这样做:
Object
通过明确地将运算符的假分支设为dim val1 As Integer? = If(5 > 2, Nothing, New Integer?(43))
,真分支中的Integer?
将表示空值,而不是默认的Nothing
值。