【问题标题】:VB Nullables and NothingsVB Nullables 和 Nothing
【发布时间】:2015-08-09 17:52:43
【问题描述】:

我在 VB.NET 中研究了 C#default 关键字等效性,发现了 this question

然后我就好奇了。一些背景知识 - 我正在解析一个 Excel 电子表格,其中许多列可以为空,对于我来说,整数列 0null 之间肯定存在差异。

我写了一个小解析方法:

Function Test(ByVal i As String) As Nullable(Of Integer)
    Dim j As Integer

    If Integer.TryParse(i, j) Then
        Return j
    Else
        Return Nothing
    End If
End Function

这似乎工作正常。但在这里,如果我愿意,我可以返回 Integer

Function Test(ByVal i As String) As Nullable(Of Integer)
    Return 2 'or Return Nothing
End Function

我也可以在C# 中:

 static void Main(string[] args)
 {
     int? j = Test("1");
 }

 public static int? Test(string i)
 {
     return 2; //or return null
 }

在上面的代码中,如果我将j 更改为int,我会得到一个编译时转换错误,这完全可以理解。

现在我的问题 - 在 VB 中,如果我尝试类似的方法:

Sub Main()
    Dim j As Integer = Test("hello")
End Sub

Function Test(ByVal i As String) As Nullable(Of Integer)
    Dim j As Integer
    Return If(Integer.TryParse(i, j), j, Nothing)
End Function

或者,在我的测试用例中,i 不是Integer,它可以重写为:

Function Test(ByVal i As String) As Nullable(Of Integer)
    Return DirectCast(Nothing, Integer)
End Function

由于Nothing 在 VB.NET 中的工作方式,这段代码编译并运行没有错误 -- j 设置为整数的默认值 0

这对我来说太脏了。在这种情况下,您可以稍微改变方法的意图,而不会出现任何警告或错误。我只是好奇,这是Nothing在VB中工作方式的无意副产品,还是预期目的?

【问题讨论】:

  • 是的,Int 在 vb 中默认为 0...

标签: vb.net default-value nothing


【解决方案1】:

您的 VB.Net 代码可以编译,因为您使用的是后期绑定,它允许在运行时更改变量的类型。

如果您使用OPTION STRICT ON 编译代码,您将收到如下编译器错误:

Option Strict On 不允许从 'Integer?' 进行隐式转换为“整数”。

【讨论】:

  • 谢谢。简单的解释,但它是有道理的。我真的不喜欢 VB 的更多原因。
【解决方案2】:

您不能将 NULL 分配给 VB.Net 中的值类型,在该类型中,它会使用默认值来实例化该类型。在您的情况下,您不是在创建一个 NULL 整数,而是一个包含默认值 0 的整数。

另一个好消息:转Option Strict On

【讨论】:

  • 您的第一句话与您的第二句话相矛盾。当然,您可以将Nothing 分配给值类型的变量以获取该类型的默认值。你甚至在你的第二句话中就这么说了。
猜你喜欢
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-08
  • 2023-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多