【问题标题】:Why can you assign Nothing to an Integer in VB.NET?为什么你可以在 VB.NET 中将 Nothing 分配给 Integer?
【发布时间】:2011-09-27 16:03:09
【问题描述】:

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

Dim x as Integer = Nothing

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

int x = null;

【问题讨论】:

  • 为什么英语中的不定式可以拆分,但拉丁语中的不定式不能拆分?因为英语和拉丁语是不同的语言,有着不同的规则。 C# 和 VB 是相似的——拉丁语和英语也是如此——但一个的规则不是另一个的规则。
  • 所以你的意思是 VB 是一种死语言 Eric? :)
  • 设置x = Nothing 是令人困惑的,因为第一眼看不清楚相当于x = 0。当Nothing 预期为无效值而0 - 有效值时,此分配可能会在VB.NET 代码中带来隐含错误和误解。

标签: c# vb.net


【解决方案1】:

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

【讨论】:

  • 所以它就像:x = default(int) in C# ?
  • 来自 VB.NET 语言参考:“将 Nothing 分配给变量会将其设置为其声明类型的默认值。如果该类型包含变量成员,则它们都将设置为其默认值”。 .. “如果变量是引用类型——即对象变量——Nothing 意味着该变量不与任何对象关联。”
  • @JoelFan 你搞定了,vb 的“i = Nothing”的 c# 等价物是“i = default(Int32)”。任何值类型(定义为与类相对的结构)都将获得适当的默认值,任何引用类型都将变为空。
  • @Eric,所以在一般情况下,它会像:x = default(x.GetType())
  • @JoelFan 在精神上,但它是编译时的东西,所以你不能使用像 GetType 这样的运行时方法。这就是为什么你总是看到人们使用像 defualt(String) 这样的例子。
【解决方案2】:

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

【讨论】:

  • 不确定映射,因为 VB.NET 代码有明确的类型指示:Int。然而,像Dim X = Nothing 这样的代码是你在下面写的。
【解决方案3】:

语言规范中的一个有趣示例: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)

【讨论】:

    【解决方案4】:

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

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

    来自 C# 规范 (v4)

    null-字面量可以是隐式的 转换为引用类型或 可空类型。

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

    但是设置x = Nothing 是令人困惑的,因为乍一看并不清楚它相当于x = 0

    尤其是当Nothing 被认为是一个无效值而0 - 一个有效值时,这个赋值可能会在VB.NET 代码中带来误解甚至隐含的错误。

    【讨论】:

      【解决方案5】:

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


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

      值类型不能 保持值为 Nothing 并恢复为 如果你分配它的默认值 没什么。如果您提供一个值 输入 Expression, IsNothing 总是 返回 False。

      【讨论】:

      • 我知道,但这不是我要问的问题......我的问题(C# 或 VB.NET)中的示例都没有使用可空类型
      • VB.NET 中允许比较像If myInt = Nothing Then
      猜你喜欢
      • 1970-01-01
      • 2015-07-31
      • 1970-01-01
      • 2019-07-04
      • 2021-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多