为什么结构不能包含可空的循环引用?

dlr*_*as2 3 .net c# struct circular-reference

我理解为什么结构不能包含导致逻辑内存问题的循环引用,但为什么可空引用不能绕过这个限制呢?例如:

struct Foo
{
    Foo? bar;
}
Run Code Online (Sandbox Code Playgroud)

显然这很容易导致堆栈溢出和循环引用,如果不小心,但不bar应该是指向另一个Foo实例的指针,默认为null?或者(更有可能)我不明白在内存中如何排列可空的值类型?

(我的背景知识主要包括来自这个问题和答案的信息.)

And*_*rew 8

不,不完全.可空值类型实际上Nullable<>是值类型作为泛型参数的实例.问号只是一个简写.

Nullable是一个结构,因此是一个值类型.由于它保留了对Foo结构的引用,因此您仍然具有由值类型组成的循环引用.


Jon*_*eet 6

Nullable<T> 是一个看起来像这样的结构(不包括构造函数等):

public struct Nullable<T> where T : struct
{
    private readonly T value;
    private readonly bool hasValue;
}
Run Code Online (Sandbox Code Playgroud)

由于这是一个类型,你Foo最终会看起来像这样:

struct Foo
{
    Foo barValue;
    bool hasBarValue;
}
Run Code Online (Sandbox Code Playgroud)

现在希望更明显的是这是一个问题:)


Bro*_*ass 5

Foo? bar 是一个快捷方式

Nullable<Foo> bar;
Run Code Online (Sandbox Code Playgroud)

Nullable<T> 是一个大致如下所示的结构:

public struct Nullable<T> where T : struct
{
    private readonly T value;
    private readonly bool hasValue;
    //..
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下Foo,Nullable<Foo>将持有一个Foo,反过来又持有一个Nullable<Foo>...