为什么嵌套类会被“继承”?

6

考虑以下代码示例:

class Outer
{
    public class Nested { }
}

class SubOuter : Outer { }

class Test
{
    Test()
    {
        Outer.Nested x;     // Makes sense.
        SubOuter.Nested y;  // Compiles, but why?
    }
}

似乎嵌套类被子类“继承”了。这有什么意义?我能用这个特性做些什么,否则我不能(或不能轻易地)做到?Outer.NestedSubOuter.Nested不是完全等价的吗?
澄清:当然它可以编译,因为C#规范是这样规定的。我明白这一点。我问的是,为什么C#要设计成这样,因为它似乎没有为语言增加什么东西。如果您有相反的例子,即使用此功能可以更轻松/更短/更好的代码,请在答案中分享,我会很高兴接受它。

2
因为Nested是公共的,所以SubOuter类可以在基类中看到它。 - Hakan Fıstık
2
问题出在哪里,为什么你不想让它编译。 - Hakan Fıstık
1
Outer.NestedSubOuter.Nested是等价的,在声明方式以外它们没有任何区别。 - Hakan Fıstık
6
不,你是在“请求”一个新的特性。所有公共基类成员都可以通过继承类访问。为什么应该将“类”与例如方法等其他内容区别对待?编译器团队为什么要专门添加代码以“防止”您进行此类访问?(然后再将错误消息翻译成各种语言、文档化等) - Damien_The_Unbeliever
1
这更接近于“不继承类的公共非实例成员完全违背了人们的期望。” 至少这是我所期望的。除此之外,这可能还会有相当大的实现成本。 - Willem van Rumpt
显示剩余4条评论
2个回答

6

从测试的角度来看,Nested只是一个标识符,就像成员一样。例如,由于它是public,您可以在任何可以访问OuterSubOuter类中的任何地方访问它。但是,这两种用法都是相同的,它们标识相同的类。

甚至可以通过另一个引用其中一个:

Outer.Nested x = new Outer.Nested(); 
SubOuter.Nested y = x;

甚至可以

使用

Outer.Nested x = new SubOuter.Nested();
SubOuter.Nested y = x;

然而,正如您在调试器中看到的那样,xy共享对Outer.Nested的引用,而不是SubOuter.Nested

编辑:正如其他人已经提到的,这并不是什么新功能,它只是类内成员的通常处理方式。因此,它不会为语言增加任何好处,因为您描述的功能根本不存在。这遵循最少惊奇原则

但是,将嵌套类进行不同处理将是一个新功能。


3
因为Nested类是公共的,所以SubOuter类可以在基类中看到它。
而且你是正确的。Outer.NestedSubOuter.Nested是等效的,除了声明方式外,它们之间没有区别。
根据您的评论,该功能已经在.NET中实现(我指子类可以看到基类的公共和受保护成员),因此在.NET中实现此功能不会产生额外的成本。
您可以将嵌套类视为基类中的任何其他属性。
这是非常重要的解释,由@Damien_The_Unbeliever在您的问题评论中写明。
“不,你正在要求一项新功能。所有基类的公共成员都可以通过继承类访问。为什么类应该与方法不同,并且为什么编译器团队必须专门添加代码来防止您进行此类访问?(然后将错误消息翻译成各种语言,对其进行文档化等)”

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接