5

可能重复:
错误??如果您通过三元运算符将值分配给可为空的整数,则它不能变为空

虽然这个问题似乎与许多问题重复,但实际上是出于特定原因而提出的。以这段代码为例:

Dim n As Integer? = If(True, Nothing, 1)

在该代码中,三元表达式应该返回 Nothing,但它将 n 设置为 0。如果这是 C#,我可以说它default(int?)会完美运行。现在看起来我将不得不放弃三元并使用常规的 If 块,但我真的想使用三元。

如果没有什么是真正的 VB.NET 等效于 C# 的默认值,你如何解释这种行为?

4

1 回答 1

6

与 C# 等效的VB.NETdefault是关键字Nothing. 只要Id.Value返回一个Integer值,您编写的代码就应该编译得很好。

您更新的样本出错的原因是Nothing. 在 VB.NETNothing中是空值,它可以转换为任何类型。现在对于一个If表达式,编译器必须推断返回的类型应该是什么,它通过查看两个值参数来做到这一点。

该值Nothing没有类型,但文字1有类型IntegerNothing可转换为,Integer因此编译器确定Integer是此处的最佳类型。这意味着当Nothing被选为值时,它将被解释为Integer而不是Integer?

解决此问题的最简单方法是明确告诉编译器您希望1被视为Integer?.

Dim n As Integer? = If(True, Nothing, CType(1, Integer?))
于 2012-04-19T18:46:16.747 回答