VB Nullables和Nothings

时间:2015-05-27 14:49:23

标签: vb.net default-value nothing

我在VB.NET中研究了C#的{​​{1}}关键字等价,并遇到了this question

然后我好奇。一些背景 - 我正在解析excel电子表格,其中许多列可以为null,并且在default0的整数列之间肯定存在差异。

我写了一个小解析方法:

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,我将收到编译时转换错误,这完全合理。

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

int

或者,在我的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中的工作方式,此代码编译并运行时没有错误 - j设置为Integer的默认值0

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

2 个答案:

答案 0 :(得分:4)

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

如果使用OPTION STRICT ON编译代码,则会出现如下编译器错误:

  

Option Strict On禁止来自' Integer的隐式转换?'到'整数'。

答案 1 :(得分:2)

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

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