VB Nullables和Nothings

Jon*_*lis 9 vb.net default-value nothing

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

然后我好奇.一些背景 - 我正在解析一个excel电子表格,其中许多列可以为null,并且我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
Run Code Online (Sandbox Code Playgroud)

这似乎工作正常.但是在这里,Integer如果我想要,我可以回复:

Function Test(ByVal i As String) As Nullable(Of Integer)
    Return 2 'or Return Nothing
End Function
Run Code Online (Sandbox Code Playgroud)

我也可以参加C#:

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

 public static int? Test(string i)
 {
     return 2; //or return null
 }
Run Code Online (Sandbox Code Playgroud)

在上面的代码中,如果我j改为a 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
Run Code Online (Sandbox Code Playgroud)

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

Function Test(ByVal i As String) As Nullable(Of Integer)
    Return DirectCast(Nothing, Integer)
End Function
Run Code Online (Sandbox Code Playgroud)

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

这对我来说太脏了.在这种情况下,您可以在某种程度上改变方法的意图,而不会出现任何警告或错误.我只是好奇,我认为,这是NothingVB的工作方式的无意的副产品,还是这个目的?

slo*_*oth 4

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

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

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