为什么我不能将此变量分配为可空值? (Visual Basic)

时间:2020-10-23 12:32:05

标签: vb.net nullable

我想使该变量可以赋空值。但是给'?似乎不起作用。请帮助我找到出路。我是新来的。谢谢

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

1 个答案:

答案 0 :(得分:2)

我知道这是一个VB.Net问题,但要了解这一点,也了解C#的工作原理也很有帮助。在C#中,有一个[ { "a":1 "b":["a","b"] } ... ] 的概念。您可以将"a" "b" 1 a 1 b 的值分配给引用类型(即:VB.Net类),但不能将null的值分配给引用类型(即:VB.Net结构)。值类型(结构)变量总是具有某种值

回到VB.Net,我们有了null关键字。但是,null 不是C#的null的直接类似物。更接近匹配C#Nothing表达式。 VB.Net允许您将Nothing分配给值类型。只是在执行操作时,您会获得该类型的默认值。

default(T)类型和相关的语言语法功能旨在允许值类型使用新的空语义 。这不适用于引用类型,因为引用类型已经具有null 的概念。


当我在这里的时候,我也看到了:

Nothing

Nullable(Of T)是引用类型(类)。传递引用类型Sub Process(ByRef E As Elmt3DObject) 几乎总是一个错误。您仍然需要Elmt3DObject,因为为类传递ByRef仍会传递引用。它会生成参考的副本,但仍只是参考。

相关问题