我在VB.NET中研究了C#
的{{1}}关键字等价,并遇到了this question。
然后我好奇。一些背景 - 我正在解析excel电子表格,其中许多列可以为null,并且在default
和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
,我将收到编译时转换错误,这完全合理。
现在我的问题 - 在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中的工作方式的无意副产品,还是这个目的?
答案 0 :(得分:4)
您的VB.Net代码编译是因为您使用了后期绑定,这允许在运行时更改变量的类型。
如果使用OPTION STRICT ON
编译代码,则会出现如下编译器错误:
Option Strict On禁止来自' Integer的隐式转换?'到'整数'。
答案 1 :(得分:2)
您无法将NULL
分配给VB.Net中的值类型,在该类型中,它使用其默认值实例化该类型。在您的情况下,您不是创建NULL
整数,而是一个保持默认值为0的整数。
另一个好注意事项:转Option Strict On