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

时间:2010-05-05 21:24:53

标签: c# vb.net

为什么我允许将Nothing分配给VB.NET中的值类型:

Dim x as Integer = Nothing

但是我不允许在C#中分配null

int x = null;

5 个答案:

答案 0 :(得分:45)

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

的整数

答案 1 :(得分: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的直接模拟,至少在与值类型一起使用时。

答案 2 :(得分:6)

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

7.1.1可空值类型 对于价值类型,一个?可以将修饰符添加到类型名称以表示该类型的可空版本。可空值类型可以包含与该类型的非可空版本以及空值相同的值。因此,对于可空值类型,将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)

答案 3 :(得分:2)

关于VB.NET规范(第10版)中的Nothing

  

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

来自C#specs(v4)

  

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

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

但是设置x = Nothing会让人感到困惑,因为在第一个视图中并不清楚等同于x = 0

特别是当Nothing预期为无效值且0 - 有效值时,此赋值可能会在VB.NET代码中带来误解甚至隐含错误。

答案 4 :(得分:0)

Here's an interesting article关于VB.NET和Nothing vs. Null。一小段摘录:


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

  

值类型不能   保持Nothing的值并恢复为   如果您指定,则为默认值   什么都没有。如果您提供值   输入Expression,IsNothing总是如此   返回False。