vb.net - 当类型是值类型时,可以将 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 我不希望这种事情发生并在编译时导致错误,或者我需要求助于运行时类型检查?
解决方案
Nothing
在 VB 中与null
在 C# 中不同。更好的等价物是default
,因为它代表其类型的默认值。引用类型的行为是相同的(其默认值为空引用),但正如您所注意到的,值类型的行为却大不相同。
由于这是语言设计的一部分,因此无法将其关闭。
另请参阅 Anthony Green 的文章:https ://anthonydgreen.net/2019/02/12/exhausting-list-of-differences-between-vb-net-c/#46
推荐阅读
- javascript - 获取特定的 json 字典并在 javascript 中解析它
- javascript - 如何像这些网站一样进行慢速滚动
- go - kubernetes 客户端只看一次资源
- spring-boot - 如何在 OAuth2 资源服务器中提取自定义主体?
- css - 为什么样式不适用于我的元素?
- php - 未经授权的 Mirosoft Graph 请求?日历.阅读
- angular - Visual Studio 警告:(ESLint)无法加载配置“defaults/configurations/eslint”以扩展。引用自 C:\Users\{username}\.eslintrc
- c++ - 模块“XXXXX”未安装 qt/qml
- java - 如何在Java中将十六进制字符串转换为字节数组
- python - 如何向 Google Cloud Natural Language API 发送一批字符串?