8
public struct Unit
{
    Unit u;
}

原因:

'Unit' 类型的结构成员 'Unit.u' 在结构布局中导致循环。

public class Unit
{
    Unit u;
}

编译。我理解我认为的问题。引用一个Unit对象时会形成一个无限循环,因为它必须初始化另一个成员Unit等等。但是为什么编译器只限制问题structs呢?问题不是也一直存在class吗?我错过了什么吗?

4

4 回答 4

21

问题在于布局

Unit是一个结构时,a 的任何值Unit都必须包含另一个相同类型(因此大小相同)的值,无穷无尽。这不可能。我想您可能会争辩说,在没有其他字段的情况下,字段 forUnit不应该占用内存,因此您可以将其包含在自身中 - 但我相信 CLR 的工作方式可确保所有结构至少占用 1 个字节......

Unit是一个类时,一个Unit对象只需要包含对另一个对象的引用。Unit没有存储问题,并且值可以为 null 开始。

可以这样想:你不能有一所房子包含另一所用相同蓝图建造的房子,但你当然可以有一所房子包含一张纸,上面有类似房子的地址......

于 2013-01-13T23:05:59.010 回答
3

类是引用类型,所以我想不同之处在于在class示例中,它只需要保存对另一个实例的引用。对于您struct的值类型,它需要再次包含整个结构,因此是无限循环。

于 2013-01-13T23:07:10.743 回答
2

struct自动使用一个值初始化,因此在您的示例中,一个Unit值包含一个Unit值,该值包含一个值,该Unit值包含一个Unit值,等等...

您的class示例仅初始化对 的引用null,它没有无限回归。但是,如果您执行以下操作,您会遇到类似的问题:

class Unit
{
   Unit mUnit = new Unit();
}

现在,构造 aUnit构造 a Unit,构造 aUnit等......在这种情况下,如果/当您尝试实例化Unit对象时,您将遇到运行时堆栈溢出异常。

我认为您可以struct通过使用可为空的类型来避免该问题,但问题仍然存在。我相信这是因为struct当设置为null.

于 2013-01-13T23:15:01.907 回答
1

因为Structvalue typeUnit可以保持价值本身吗?我认为这是不可能的。

但什么时候Unitclassclassreference typeUnitobject 可以持有对另一个对象的引用Unit。没事。

于 2013-01-13T23:07:18.110 回答