这种C#编译器行为是一个bug还是一个特性?

这种C#编译器行为是一个bug还是一个特性?,c#,compiler-construction,C#,Compiler Construction,为什么以下代码段在C#中有效?这是编译器的一个特性还是一个bug class A { public class B : A { } } class C : A.B { public void Foo(C.B b) { } } class D : A { public void Foo(D.B.B.B.B b) { } } 另见 这是法律法规,但很奇怪。如果你愿意的话,我可以在规范中找到关于名称解析的部分,但这绝

为什么以下代码段在C#中有效?这是编译器的一个特性还是一个bug

class A
{
    public class B : A
    {

    }
}

class C : A.B
{
    public void Foo(C.B b)
    {

    }
}

class D : A
{
    public void Foo(D.B.B.B.B b)
    {

    }
}
另见


这是法律法规,但很奇怪。如果你愿意的话,我可以在规范中找到关于名称解析的部分,但这绝对是合法的。我以前和Eric Lippert谈过类似的话题。奇怪的是,那是用D.B.B.B.B。。。也是

谈话是由于一个问题而开始的


C#3.0规范的相关部分是3.8,但它太长,太复杂,不值得在这里发布。

这相当有趣。不过,我不知道这会有什么危害。

请注意,代码分析指南中说明了这一点

  • D是A
  • A具有嵌套类型B
  • B是A
  • 转到2

  • 我不明白,你为什么把C类也包括进去。我想如果你把它去掉,问题也会一样(而且会短一点),因为C继承的是没有“显式”子类的子类。以它自己的方式怪异。