为什么在 VB.NET 中可以将 Nothing 赋给整数?

问题描述 投票:0回答:5

为什么我可以将

Nothing
分配给 VB.NET 中的值类型:

Dim x as Integer = Nothing

但是我不允许在 C# 中赋值

null
:

int x = null;
c# vb.net
5个回答
56
投票

当您将

Nothing
分配给 VB.Net 中的值类型时,它会使用其默认值实例化该类型。因此,在这种情况下,您不是创建一个空整数,而是创建一个保存默认值 0 的整数


8
投票

等效的 C# 代码如下所示:

int x;
x = default(int);

请注意,对于引用类型,同样的情况仍然成立:

Dim y As Object
y = Nothing

如果直接映射到 C#,VB.Net 代码将如下所示:

object y;
y = default(object);

.Net 中

object
(或任何其他引用类型)的默认值是
null
,这是一件好事。 所以我们看到 VB.Net 的
Nothing
并不是 C# 的
null
的直接模拟,至少在与值类型一起使用时是这样。


6
投票

语言规范中的一个有趣示例:http://www.microsoft.com/downloads/en/details.aspx?FamilyID=01eee123-f68c-4227-9274-97a13d7cb433&displaylang=en

7.1.1 可空值类型 对于值类型,一个 ?可以将修饰符添加到类型名称中以表示该类型的可为空版本。可空值类型可以包含与该类型的不可空版本相同的值以及空值。因此,对于可为 null 的值类型,将 Nothing 分配给该类型的变量会将变量的值设置为 null 值,而不是该值类型的零值。例如:

Dim x As Integer = Nothing
Dim y As Integer? = Nothing

' Prints zero
Console.WriteLine(x)
' Prints nothing (because the value of y is the null value)
Console.WriteLine(y)

3
投票

关于 VB.NET 规范 (v.10) 中的

Nothing

Nothing 是一个特殊的文字;它没有类型并且是 可转换为类型中的所有类型 系统,包括类型参数。 当转换为特定类型时, 它相当于默认值 该类型的值。

来自 C# 规范 (v4)

null-文字可以隐式地 转换为引用类型或 可空类型。

因此,C# null 无法隐式转换为值类型,但 VB.NET Nothing 可以。

但是设置

x = Nothing
很混乱,因为乍一看并不清楚它相当于
x = 0

特别是当

Nothing
预计为无效值而
0
为有效值时,此分配可能会在 VB.NET 代码中带来误解,甚至隐含错误。


0
投票

这是一篇关于 VB.NET 和 Nothing 与 Null 的有趣文章。一小段摘录:


...值类型,不能与 Nothing 或 Null 进行比较。值类型是整数和字节等类型。来自 Visual Basic 语言参考:

值类型不能 保持 Nothing 值并恢复为 如果您指定它的默认值 没什么可说的。如果您提供一个值 输入表达式,始终为 IsNothing 返回 False。

© www.soinside.com 2019 - 2024. All rights reserved.