作者:好运娟_968 | 来源:互联网 | 2022-12-07 12:58
1> Jon Skeet..:
这是一个嵌套类的事实在这里无关紧要.它是派生类的事实更为重要.除了泛型和访问的详细信息(例如,可以访问包含类的私有成员的嵌套类),嵌套类和非嵌套类之间的差异相对较小.
所以让我们说明:
class BaseClass
{
DerivedClass derived = new DerivedClass();
}
class DerivedClass : BaseClass
{
}
StackOverflowException
如果您尝试创建BaseClass
(或DerivedClass
)实例,它仍会编译,但仍会失败.
的布局是精细:BaseClass
具有单一字段,它是将一个参考DerivedClass
.有没有在方面没有问题,知道"有多大"要么BaseClass
或者DerivedClass
是-事实上无需初始化方面,这将是绝对的罚款.这里重要的是它DerivedClass
是一个引用类型,因此该derived
字段的值只是一个引用.
这里没有破解C#语言规则,设计一个禁止这种情况而不禁止有效用例的语言规则真的很难.
这里的递归与单个类的功能没有什么不同:
class BaseClass
{
BaseClass other = new BaseClass();
}
同样,它是完全有效的代码,但会导致堆栈溢出.
尽管没有继承,但我怀疑你想到的问题很容易用结构体来证明:
struct Tweedledum
{
Tweedledee dee;
}
struct Tweedledee
{
Tweedledum dum;
}
这确实失败了,因为没有合适的布局:值直接Tweedledum
包含Tweedledee
值,反之亦然.不是参考:实际价值.
这里的错误是:
error CS0523: Struct member 'Tweedledum.dee' of type 'Tweedledee' causes a cycle in the struct layout
error CS0523: Struct member 'Tweedledee.dum' of type 'Tweedledum' causes a cycle in the struct layout