虽然这个问题似乎与许多问题重复,但实际上是出于特定原因而提出的。以这段代码为例:
Dim n As Integer? = If(True, Nothing, 1)
在该代码中,三元表达式应该返回 Nothing,但它将 n 设置为 0。如果这是 C#,我可以说它default(int?)
会完美运行。现在看起来我将不得不放弃三元并使用常规的 If 块,但我真的想使用三元。
如果没有什么是真正的 VB.NET 等效于 C# 的默认值,你如何解释这种行为?
虽然这个问题似乎与许多问题重复,但实际上是出于特定原因而提出的。以这段代码为例:
Dim n As Integer? = If(True, Nothing, 1)
在该代码中,三元表达式应该返回 Nothing,但它将 n 设置为 0。如果这是 C#,我可以说它default(int?)
会完美运行。现在看起来我将不得不放弃三元并使用常规的 If 块,但我真的想使用三元。
如果没有什么是真正的 VB.NET 等效于 C# 的默认值,你如何解释这种行为?
与 C# 等效的VB.NETdefault
是关键字Nothing
. 只要Id.Value
返回一个Integer
值,您编写的代码就应该编译得很好。
您更新的样本出错的原因是Nothing
. 在 VB.NETNothing
中是空值,它可以转换为任何类型。现在对于一个If
表达式,编译器必须推断返回的类型应该是什么,它通过查看两个值参数来做到这一点。
该值Nothing
没有类型,但文字1
有类型Integer
。Nothing
可转换为,Integer
因此编译器确定Integer
是此处的最佳类型。这意味着当Nothing
被选为值时,它将被解释为Integer
而不是Integer?
。
解决此问题的最简单方法是明确告诉编译器您希望1
被视为Integer?
.
Dim n As Integer? = If(True, Nothing, CType(1, Integer?))