为什么你可以在VB.NET中为整数分配Nothing?

为什么我允许在VB.NET中为Ntype赋值:

 Dim x as Integer = Nothing 

但我不允许在C#中指定null

 int x = null; 

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

等效的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的直接模拟,至少在与值类型一起使用时。

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

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

 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) 

关于VB.NET规范(v.10)中的任何内容:

没有什么是特殊的文字; 它没有类型,可以转换为类型系统中的所有类型,包括类型参数。 转换为特定类型时,它等效于该类型的默认值。

来自C#规格(v4)

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

因此,C# null不能隐式转换为值类型,但VB.NET 没有什么可以。

但是设置x = Nothing是令人困惑的,因为在第一个视图中不清楚等于x = 0

特别是当Nothing不是一个无效值而0 – 一个有效值时,这个赋值可能会给VB.NET代码带来误解甚至隐含的错误。

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


…值类型,无法与Nothing或Null进行比较。 值类型是诸如整数和字节之类的类型。 从Visual Basic语言参考:

如果为其分配Nothing,则值类型不能保存Nothing值并恢复为其默认值。 如果在Expression中提供值类型,则IsNothing始终返回False。