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编译器假定整个运算符返回对象,而不是整数 要使第一个示例按照您想要的方式工作,您需要向编译器说明

有什么好处?这是一个bug,还是我忽略了什么?

问题是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))