VB 可空值和空值
VB Nullables and Nothings
我在 VB.NET 中研究了 C#
的 default
关键字等价性并发现了 this question。
然后我很好奇。一些背景知识——我正在解析一个 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
这似乎工作正常。但是在这里,我可以 return 一个 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
由于 Nothing
在 VB.NET 中的工作方式,此代码编译和运行时没有错误 -- j 设置为 Integer 的默认值 0。
我觉得这太脏了。在这种情况下,您可以稍微改变方法的意图,而不会出现任何警告或错误。我想我只是好奇,这是 Nothing
在 VB 中工作方式的无意副产品,还是这是预期目的?
您的 VB.Net 代码可以编译,因为您使用的是后期绑定,它允许在运行时更改变量的类型。
如果您使用 OPTION STRICT ON
编译您的代码,您将得到一个编译器错误,例如:
Option Strict On disallows implicit conversions from 'Integer?' to 'Integer'.
您不能将 NULL
分配给 VB.Net 中的值类型,在该类型中它使用默认值实例化该类型。在您的情况下,您不是在创建一个 NULL
整数,而是一个包含默认值 0.
的整数
另一个好记:转Option Strict On
我在 VB.NET 中研究了 C#
的 default
关键字等价性并发现了 this question。
然后我很好奇。一些背景知识——我正在解析一个 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
这似乎工作正常。但是在这里,我可以 return 一个 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
由于 Nothing
在 VB.NET 中的工作方式,此代码编译和运行时没有错误 -- j 设置为 Integer 的默认值 0。
我觉得这太脏了。在这种情况下,您可以稍微改变方法的意图,而不会出现任何警告或错误。我想我只是好奇,这是 Nothing
在 VB 中工作方式的无意副产品,还是这是预期目的?
您的 VB.Net 代码可以编译,因为您使用的是后期绑定,它允许在运行时更改变量的类型。
如果您使用 OPTION STRICT ON
编译您的代码,您将得到一个编译器错误,例如:
Option Strict On disallows implicit conversions from 'Integer?' to 'Integer'.
您不能将 NULL
分配给 VB.Net 中的值类型,在该类型中它使用默认值实例化该类型。在您的情况下,您不是在创建一个 NULL
整数,而是一个包含默认值 0.
另一个好记:转Option Strict On