为什么我允许将Nothing
分配给VB.NET中的值类型:
Dim x as Integer = Nothing
但是我不允许在C#中分配null
:
int x = null;
答案 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。