Vb.net 缺陷如果通过三元运算符为可空整数赋值,则它可以';不能变为空
有什么好处?这是一个bug,还是我忽略了什么?问题是VB.NET中的Vb.net 缺陷如果通过三元运算符为可空整数赋值,则它可以';不能变为空,vb.net,nullable,ternary-operator,Vb.net,Nullable,Ternary Operator,有什么好处?这是一个bug,还是我忽略了什么?问题是VB.NET中的没有任何东西与C#中的null工作方式不同。如果在值类型(例如Integer)的上下文中使用Nothing,则表示该类型的默认值。在这种情况下,这是0 在第一个示例中,三元运算符的两个分支都是有效的Integer值。true分支表示0,false分支表示43 在第二个示例中,三元运算符的两个分支都不是有效的整数值,因此迫使VB.NET编译器假定整个运算符返回对象,而不是整数 要使第一个示例按照您想要的方式工作,您需要向编译器说明
没有任何东西
与C#中的null
工作方式不同。如果在值类型(例如Integer
)的上下文中使用Nothing
,则表示该类型的默认值。在这种情况下,这是0
在第一个示例中,三元运算符的两个分支都是有效的Integer
值。true分支表示0,false分支表示43
在第二个示例中,三元运算符的两个分支都不是有效的整数
值,因此迫使VB.NET编译器假定整个运算符返回对象
,而不是整数
要使第一个示例按照您想要的方式工作,您需要向编译器说明,三元运算符应该解析为整数?
,而不是整数
或对象
。您可以这样做:
dim val1 As Integer? = If(5 > 2, Nothing, 43)
' val1 = 0
dim val1 As Integer? = If(5 > 2, Nothing, Nothing)
' val1 = Nothing
通过显式地将运算符的假分支设置为
Integer?
,真分支中的Nothing
将表示空值,而不是默认的Integer
值。或者将Nothing
完全删除:dim val1作为整数?=如果(5>2,新整数?,43)
dim val1 As Integer? = If(5 > 2, Nothing, New Integer?(43))