我刚刚阅读了Eric Lippert撰写的这篇有趣的文章Top 10 Worst C# Features。接近结束时他说:
上述冒号之后解析名称的规则不是 有根据的;你可以在你需要知道的情况下结束 基类是为了确定基类是什么。
通过冒号他指的是继承运算符(例如Dog : Animal
)。
Eric指的是什么情况?任何人都可以提供代码示例吗?
答案 0 :(得分:21)
这可能发生在具有泛型,继承和嵌套类的复杂场景中:
class Base<T> {
public class Inner {}
}
class Derived : Base<Derived.Inner2> {
public class Inner2 : Inner {}
}
Derived
的基类,我们需要绑定Derived.Inner2
。Derived.Inner2
,我们需要解析Inner
符号。Inner
符号继承自其包含范围的基类,因此我们需要再次确定Derived
的基类。答案 1 :(得分:14)
SLaks给出了一个很好的答案;请参阅我的评论以获得一些补充说明
正如我在评论中所说,我正在寻找关于这个主题的旧笔记,如果我找到它们,我会写一篇博客。这是一个有趣的附加示例。这个计划是合法的。类声明和字段声明中N
的含义是相同还是不同?如果它们是相同的,那么它们的完全限定类型表达式是什么?如果它们不同,为什么规范要求它们不同?
public class N {}
public class B<T>
{
public class N {}
}
public class D : B<N> // base class
{
N n; // field
}
这说明了一个基本问题:名称查找要求基类已知,但是基类是按名称查找的。 p>
现在想想界面如何在混合中起作用。假设类D
也实现了一个接口IN
,类似地嵌套在B
中并且可以全局使用。接口查找是否解析为基类或全局命名空间?这些是您在编写编译器时必须解决的各种问题。