为什么我可以将
Nothing
分配给 VB.NET 中的值类型:
Dim x as Integer = Nothing
但是我不允许在 C# 中赋值
null
:
int x = null;
当您将
Nothing
分配给 VB.Net 中的值类型时,它会使用其默认值实例化该类型。因此,在这种情况下,您不是创建一个空整数,而是创建一个保存默认值 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 可空值类型 对于值类型,一个 ?可以将修饰符添加到类型名称中以表示该类型的可为空版本。可空值类型可以包含与该类型的不可空版本相同的值以及空值。因此,对于可为 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)
关于 VB.NET 规范 (v.10) 中的
Nothing
:
Nothing 是一个特殊的文字;它没有类型并且是 可转换为类型中的所有类型 系统,包括类型参数。 当转换为特定类型时, 它相当于默认值 该类型的值。
来自 C# 规范 (v4)
null-文字可以隐式地 转换为引用类型或 可空类型。
因此,C# null 无法隐式转换为值类型,但 VB.NET Nothing 可以。
但是设置
x = Nothing
很混乱,因为乍一看并不清楚它相当于 x = 0
。
特别是当
Nothing
预计为无效值而 0
为有效值时,此分配可能会在 VB.NET 代码中带来误解,甚至隐含错误。
这是一篇关于 VB.NET 和 Nothing 与 Null 的有趣文章。一小段摘录:
...值类型,不能与 Nothing 或 Null 进行比较。值类型是整数和字节等类型。来自 Visual Basic 语言参考:
值类型不能 保持 Nothing 值并恢复为 如果您指定它的默认值 没什么可说的。如果您提供一个值 输入表达式,始终为 IsNothing 返回 False。