可能重复:
Bug?? If you assign a value to a nullable integer via a ternary operator, it can't become null
虽然这个问题似乎与许多问题重复,但实际上却被问到了一个具体的原因。拿这个代码,例如:
Dim n As Integer? = If(True, Nothing, 1)
在该代码中,三元表达式应返回Nothing,但它将n设置为0.如果这是C#,我可以说default(int?)
并且它可以完美地工作。现在看起来我将不得不抛弃三元并使用常规的If块,但我真的想使用三元组。
如果没有什么是真正的VB.NET等同于C#的默认值,你怎么解释这种行为?
答案 0 :(得分:6)
与{C} default
等效的VB.NET是关键字Nothing
。只要Id.Value
返回Integer
值,您编写的代码就可以编译得很好。
您更新的示例出错的原因是Nothing
的性质。在VB.NET中Nothing
是空值,它可以转换为任何类型。现在对于If
表达式,编译器必须推断返回的类型应该是什么,并且它通过查看两个值参数来实现。
值Nothing
没有类型,但文字1
的类型为Integer
。 Nothing
可转换为Integer
,因此编译器确定Integer
是此处的最佳类型。这意味着当选择Nothing
作为值时,它将被解释为Integer
而不是Integer?
。
解决此问题的最简单方法是明确告诉编译器您希望将1
视为Integer?
。
Dim n As Integer? = If(True, Nothing, CType(1, Integer?))