VB中的可空类型和空值

9
我研究了在VB.NET中与C#的"default"关键字等价的内容,并发现了this question
然后我变得好奇。一些背景-我正在解析一个Excel电子表格,在其中许多列可以为空,对我来说,整数列为“0”和为“null”之间肯定有区别。
我写了一个小的解析方法:
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

因为在VB.NET中Nothing的工作方式,这段代码可以编译和运行而没有错误——j被设置为整数的默认值0
对我来说,这感觉很不好。在这种情况下,您可以在没有任何警告或错误的情况下略微改变方法的意图。我只是好奇,这是Nothing在VB中工作方式的无意副产品,还是有意为之?

是的,在VB中,Int默认为0 - Trevor
2个回答

4
你的VB.Net代码编译通过是因为你使用了晚期绑定,这允许在运行时更改变量的类型。
如果你使用OPTION STRICT ON编译你的代码,你会得到一个编译器错误,比如:

Option Strict On 不允许从 'Integer?' 隐式转换到 'Integer'。


简单的解释,但很有道理。更多原因是我真的不喜欢VB。 - Jonesopolis

2
在VB.Net中,如果您使用默认值类型实例化该类型,则无法将NULL分配给它。在您的情况下,您不是创建一个空整数,而是创建一个保持默认值0的整数。
另一个好的提示:打开“Option Strict”。

你的第一句话与第二句话相矛盾。当然,你可以将Nothing分配给值类型变量以获取该类型的默认值。你甚至在第二句话中说了这个。 - sloth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接