当类型是值类型时,可以将 null 传递给泛型函数
Can pass null to generic function when type is a value type
我目前仅限于使用 VB.NET 使用 .NET 4.0,我想在进行 LINQ 查询时使用前置函数,这是我创建的函数:
<Extension>
Public Iterator Function Prepend(Of TSource)(source As IEnumerable(Of TSource), item As TSource) As IEnumerable(Of TSource)
If source Is Nothing Then Throw New ArgumentNullException(NameOf(source))
Yield item
For Each sourceItem In source
Yield sourceItem
Next
End Function
但有趣的是,当函数类型为值类型时传递空引用,比如 Integer:
Dim arr = {1, 2, 3}
Dim arr2 = arr.Prepend(Nothing).ToArray()
这会生成一个数组,其中包含:0、1、2、3。当转换为等效的 C# 并在 .NET Core 2.1 项目中使用时,我正确地收到编译器错误,告诉我无法在 null 和 an 之间转换整数。
有没有办法告诉 VB.NET 我不希望这种事情发生并在编译时导致错误,或者我是否需要求助于 运行-time 类型检查?
VB 中的 Nothing
与 C# 中的 null
不同。更好的等价物是 default
,因为它表示其类型的默认值。该行为对于引用类型(其默认值为空引用)是相同的,但对于您所注意到的值类型则非常不同。
由于这是语言设计的一部分,因此无法将其关闭。
另请参阅此处 Anthony Green 的文章:https://anthonydgreen.net/2019/02/12/exhausting-list-of-differences-between-vb-net-c/#46
我目前仅限于使用 VB.NET 使用 .NET 4.0,我想在进行 LINQ 查询时使用前置函数,这是我创建的函数:
<Extension>
Public Iterator Function Prepend(Of TSource)(source As IEnumerable(Of TSource), item As TSource) As IEnumerable(Of TSource)
If source Is Nothing Then Throw New ArgumentNullException(NameOf(source))
Yield item
For Each sourceItem In source
Yield sourceItem
Next
End Function
但有趣的是,当函数类型为值类型时传递空引用,比如 Integer:
Dim arr = {1, 2, 3}
Dim arr2 = arr.Prepend(Nothing).ToArray()
这会生成一个数组,其中包含:0、1、2、3。当转换为等效的 C# 并在 .NET Core 2.1 项目中使用时,我正确地收到编译器错误,告诉我无法在 null 和 an 之间转换整数。
有没有办法告诉 VB.NET 我不希望这种事情发生并在编译时导致错误,或者我是否需要求助于 运行-time 类型检查?
Nothing
与 C# 中的 null
不同。更好的等价物是 default
,因为它表示其类型的默认值。该行为对于引用类型(其默认值为空引用)是相同的,但对于您所注意到的值类型则非常不同。
由于这是语言设计的一部分,因此无法将其关闭。
另请参阅此处 Anthony Green 的文章:https://anthonydgreen.net/2019/02/12/exhausting-list-of-differences-between-vb-net-c/#46