vb.net - 为什么我不能将此变量分配给可为空的?(Visual Basic)
问题描述
我想让那个变量可以赋值为null。但是给予'?似乎不起作用。请帮我找到出路。我是新手。谢谢
Public Class T3DObject
Public V(7) As Point
Public E(5) As Surface
End Class
Public Structure ListElmt3DObject
Public first As Elmt3DObject
End Structure
Public Class Elmt3DObject
Public child As ListElmt3DObject?
Public nxt As Elmt3DObject? 'this line is error
Public obj As T3DObject? 'this also error
End Class
还有其他方法吗?请分享。谢谢!!
这是产生错误的代码:NullReferenceException
Sub Process(ByRef E As Elmt3DObject)
While E.child IsNot Nothing Or E.nxt IsNot Nothing
'code
End While
End Sub
解决方案
我知道这是一个 VB.Net 问题,但要理解这一点,了解 C# 的一些工作原理也很有帮助。在 C# 中,有一个null
. 您可以将null
值分配给引用类型(即:VB.Net 类),但不能分配null
给值类型(即:VB.Net 结构)。值类型(结构)变量总是具有某种值。
回到 VB.Net,我们有了Nothing
关键字。但是,Nothing
它不是 C# 的 null 的直接模拟。它更接近于匹配 C#default(T)
表达式。VB.Net 允许您分配Nothing
给值类型。只是当你这样做时,你会得到类型的默认值。
类型和相关的Nullable(Of T)
语言语法特性旨在为值类型提供更新的空语义。这不适用于引用类型,因为引用类型已经有了 null 的概念。
当我在这里时,我也看到了这个:
Sub Process(ByRef E As Elmt3DObject)
Elmt3DObject
是一个引用类型(类)。传递引用类型几乎总是错误的ByRef
。您仍然需要ByVal
,因为传递ByVal
Classes仍然传递引用。它会复制参考,但它仍然只是参考。
推荐阅读
- java - 为什么这个程序不打印?
- reactjs - Axios 从 React 应用程序中获取本地服务器 url 的请求
- javascript - 使用 javascript 的椭圆库验证从 golang ecdsa 库生成的签名
- java - 双向链表:在前面添加一个节点。来自 geeksforgeeks(java 代码)
- python - 如何在 Django 中正确使用带有嵌套序列化程序的 POST?
- hhvm - 如何在 Windows 7 上正确安装 Hack 和 HHVM
- python - 为什么我只能在 eBay 上抓取结果的前 4 页?
- laravel-7 - 此路由不支持 DELETE 方法。支持的方法:GET、HEAD、POST。删除第一项时
- java - Spring Data CosmosTemplate 使用系统函数创建查询
- rust - 评估借来的布尔值