当类型是值类型时可以将null传递给泛型函数

时间:2019-02-21 14:22:24

标签: vb.net generics .net-4.0

我目前仅限于使用.NET 4.0来使用VB.NET,并且在进行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和整数之间进行转换。

是否可以告诉VB.NET我不希望这种事情发生并在编译时导致错误?还是需要诉诸运行时类型检查?

1 个答案:

答案 0 :(得分:2)

VB中的

Nothing与C#中的null不同。更好的等效项是default,因为它代表其类型的默认值。您注意到,引用类型的行为相同(默认值为空引用),而值类型的行为却大不相同。

由于这是该语言设计的一部分,因此无法将其关闭。

另请参阅Anthony Green的文章:https://anthonydgreen.net/2019/02/12/exhausting-list-of-differences-between-vb-net-c/#46