首页 > 解决方案 > 为什么我不能将此变量分配给可为空的?(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.netnullable

解决方案


我知道这是一个 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,因为传递ByValClasses仍然传递引用。它会复制参考,但它仍然只是参考。


推荐阅读