9

我研究了 VB.NET 中C#default关键字等效性,并遇到了这个问题

然后我就好奇了。一些背景知识 - 我正在解析一个 excel 电子表格,其中许多列可以为空,对于我来说,整数列 being0和 being之间肯定存在差异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
 }

在上面的代码中,如果我更改jint,我会得到一个编译时转换错误,这是完全有道理的。

现在我的问题 - 在 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

或者,在我的测试用例 where iis not anInteger中,它可以重写为:

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

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

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

4

2 回答 2

4

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

如果你用 编译你的代码OPTION STRICT ON,你会得到一个编译器错误,比如:

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

于 2015-05-27T14:55:52.560 回答
2

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

另一个注意事项:转Option Strict On

于 2015-05-27T14:56:10.237 回答