VB.NET中与C#中default关键字等效的是什么?

5

可能是重复的问题:
Bug?如果您通过三元运算符将值分配给可空整数,它将无法变为null

虽然这个问题看起来像许多其他问题的重复,但实际上它是出于特定的原因而被提出的。例如,看看下面的代码:

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

在这段代码中,三元表达式应该返回Nothing,但它将n设置为0。如果这是C#,我可以说default(int?),它会完美地工作。现在看起来我必须放弃三元表达式并使用常规的If块,但我真的想使用三元表达式。
如果Nothing真的是VB.NET等效于C#默认值的话,你如何解释这种行为?

在这种情况下,“Nothing”相当于“default(int)”,因为根据表达式推断的类型是“int”,而不是“int?”。这可以通过“If(true, Nothing, new Integer?(1))”来看到。 - Marc
那么可以肯定地说,VB.NET 没有 C# 的 default 等效项。如果有的话,它可以使用类型推断来确定在这种情况下 Nothing 相当于可空整数的默认值,即 Nothing,而不是 0。 - oscilatingcretin
间接地说,这是正确的。在C#中,“default”需要一个类型,可以用于推断。在VB中,似乎“Nothing”扮演了被动角色。 - Marc
哇,这是一个重复的问题!我投票关闭。 - oscilatingcretin
1个回答

6

VB.NET 中与 C# 的 default 等价的关键字是 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?))

在我的问题中,我是否正确地在三元表达式中使用了 Nothing?如果不是,你会如何修改它以实现我想要的效果?你有没有尝试使用自己的代码重现这个问题? - oscilatingcretin
@oscilatingcretin,你使用的代码很好。我在本地编写了一个示例,它按预期工作。 - JaredPar
好的,请尝试我编辑到问题中的更新代码。当您运行那一行代码时,n是否像预期的那样被设置为Nothing?当我运行它时,它被设置为0。 - oscilatingcretin
唉,在C#中,我可以像这样写int? n = true ? default(int?) : 1;而不需要任何麻烦。好吧,感谢你的帮助。已标记并点赞。 - oscilatingcretin
1
@oscilatingcretin 这是一个权衡的情况。在C#中,default(...)表达式包括类型,因此可以明确指定所需值的类型。但在VB.Net中,它是一种无类型默认值。在大多数情况下,输入更短,比如说比null更普遍有用,但也有这种特殊情况。 - JaredPar
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接