我研究了在VB.NET中与C#的"default"关键字等价的内容,并发现了this question。
然后我变得好奇。一些背景-我正在解析一个Excel电子表格,在其中许多列可以为空,对我来说,整数列为“0”和为“null”之间肯定有区别。
我写了一个小的解析方法:
在上面的代码中,如果我将
现在我的问题是 - 在VB中,如果我尝试类似的方法:
因为在VB.NET中
对我来说,这感觉很不好。在这种情况下,您可以在没有任何警告或错误的情况下略微改变方法的意图。我只是好奇,这是
然后我变得好奇。一些背景-我正在解析一个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中工作方式的无意副产品,还是有意为之?
0
。 - Trevor