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

时间:2011-08-24 19:58:08

标签: 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

是什么给出的?这是一个错误,还是我忽略了什么?

1 个答案:

答案 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值。