首页 > 解决方案 > 当类型是值类型时,可以将 null 传递给泛型函数

问题描述

我目前仅限于使用 .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 我不希望这种事情发生并在编译时导致错误,或者我需要求助于运行时类型检查?

标签: vb.netgenerics.net-4.0

解决方案


Nothing在 VB 中与null在 C# 中不同。更好的等价物是default,因为它代表其类型的默认值。引用类型的行为是相同的(其默认值为空引用),但正如您所注意到的,值类型的行为却大不相同。

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

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


推荐阅读