当前位置:  开发笔记 > 编程语言 > 正文

为什么一个类不能在C#中扩展自己的嵌套类?

如何解决《为什么一个类不能在C#中扩展自己的嵌套类?》经验,为你挑选了2个好方法。

例如:

public class A : A.B
{
    public class B { }
}

这会从编译器生成此错误:

涉及'A'和'AB'的循环基类依赖

我总是认为一个嵌套类的行为就像一个普通的类,除了有关访问外部类的私有成员的特殊规则,但我想这两个类之间有一些隐式继承?



1> Jon Skeet..:

据我所知,没有隐含的继承.我本以为这是好的 - 虽然如果A和B都是通用的,我可以想象很奇怪.

它在规范的10.1.4节中规定:

当类B派生自类A时,A依赖于B是编译时错误.类直接依赖于它的直接基类(如果有的话)并且 直接依赖于它立即嵌套的类(如果有的话).给定这个定义,类依赖的完整类集是直接依赖于关系的传递闭包.

我已经强调了相关部分.

这就解释了为什么编译器拒绝它,但不是为什么语言禁止它.我想知道是否有CLI限制......

编辑:好的,我收到了Eric Lippert的回复.基本上,它在技术上是可能的(CLI中没有任何东西禁止它),但是:

在编译器中允许它很困难,使有关排序和循环的各种当前假设无效

这是一个非常奇怪的设计决策,比支持更容易禁止

在电子邮件主题中也注意到它会使这种事情有效:

A.B x = new A.B.B.B.B.B.B.B.B.B.B.B.B();

......但如果B来自A,那就已经(如Tinister所述)有效.

嵌套+继承=奇怪......



2> Whaledawg..:

这不是C#的东西,而是编译器的东西.编译器的一个工作是在内存中布置一个类,即一堆基本数据类型,指针,函数指针和其他类.

它不能构造A类的布局,直到它知道B类的布局是什么.在完成A类布局之前,它无法知道B类的布局.循环依赖.


我不确定你的意思.为什么不能先做嵌套类呢?在布局方面,它实际上并没有依赖外层类,是吗?
推荐阅读
ar_wen2402851455
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有