Eric Lippert的意思是"您需要知道基类是什么来确定基类是什么"?

Ian*_*son 25 c# language-design

我刚刚阅读了Eric Lippert撰写的这篇有趣的文章,十大最差C#特色.接近结束时他说:

在上述结肠之后解决姓名的规则并不充分; 您最终可能需要知道基类是什么,以确定基类是什么.

通过冒号,他指的是继承运算符(例如Dog : Animal).

Eric指的是什么情况?任何人都可以提供代码示例吗?

SLa*_*aks 21

这可能发生在具有泛型,继承和嵌套类的复杂场景中:

class Base<T> {
    public class Inner {}
}

class Derived : Base<Derived.Inner2> {
    public class Inner2 : Inner {}
}
Run Code Online (Sandbox Code Playgroud)

结果

  • 要确定Derived基类,我们需要绑定Derived.Inner2.
  • 要绑定Derived.Inner2,我们需要解析Inner符号.
  • Inner符号继承自其包含范围的基类,因此我们需要再次确定其Derived基类.

  • @IanNewson:我花了很多天,发现了十几个不同的情况,比如这个,其中一些C#做了*没有*处理好了,因为错误信息错误或不一致,选择了错误的类型,等等.问题是语言规范本身不清楚; Mads和我试图澄清它一次,但最终添加了突破性的变化.我们决定不花费太多额外的时间,因为正如你正确指出的那样,揭露规范的不充分根据的场景是非常不现实的. (6认同)
  • @SLaks:我一直试图找到我的笔记.当我(如果!)的时候,我会写一篇关于他们的博客文章.我确实记得,破坏的案例通常涉及在基类中嵌套了三个类型的通用构造的类型的情况,并且循环检测器将错误地检测到类型被循环定义. (2认同)

Eri*_*ert 14

SLaks给出了一个很好的答案; 请参阅我的评论以获得一些补充说明

正如我在评论中所说,我正在寻找关于这个主题的旧笔记,如果我找到它们,我会写一篇博客.这是一个有趣的附加示例.这个计划是合法的.N类声明和字段声明中的含义是相同还是不同?如果它们相同,那么它们的完全限定类型表达式是什么?如果它们不同,为什么规范要求它们不同?

public class N {}
public class B<T> 
{
    public class N {}
}

public class D : B<N> // base class
{
  N n;  // field
}
Run Code Online (Sandbox Code Playgroud)

这说明了一个基本问题:名称查找要求基类已知,但基类是按名称查找的.

现在想想界面如何在混合中起作用.假设类D还实现了一个接口IN,类似地嵌套在B全局中并且可用.接口查找是否解析为基类或全局命名空间?这些是您在编写编译器时必须解决的各种问题.