错误?如果通过三元运算符为可空整数赋值,则它不能为空

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值.

  • 或者完全删除`Nothing`:`dim val1 As Integer?= If(5> 2,New Integer?,43)` (3认同)