这是斯巴达还是真的?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (23)

而不修改Sparta类,编写一些代码,使MakeItReturnFalse回归false

public class Sparta : Place
{
    public bool MakeItReturnFalse()
    {
        return this is Sparta;
    }
}

我的解决方案:

public class Place { public interface Sparta { } }

但为什么SpartaMakeItReturnFalse()请参阅{namespace}.Place.Sparta而不是{namespace}.Sparta?

提问于
用户回答回答于

但为什么SpartaMakeItReturnFalse()请参阅{namespace}.Place.Sparta而不是{namespace}.Sparta

  • 如果命名空间名称或类型名称为窗体I或表格I<A1, ..., AK>所以在我们的例子中K=0:如果k为零,并且命名空间或类型名称出现在泛型方法声明中。
  • 否则,如果命名空间或类型名称出现在类型声明中,那么对于每个实例类型T(§10.3.1),从该类型声明的实例类型开始,然后继续每个封装类或结构声明的实例类型(如果有的话):
    • 如果K为零,而声明为T包含具有名称的类型参数。I,则命名空间名称或类型名称引用该类型参数。
    • 否则,如果命名空间或类型名称出现在类型声明的正文中,则为T或其任何基本类。包含具有名称的嵌套可访问类型。IK类型参数,则命名空间或类型名称引用用给定类型参数构造的类型。

  • 如果前面的步骤没有成功,那么对于每个命名空间N
  • 如果K是零和I中命名空间的名称。

所以最后一个重点就是拿起Sparta如果第一颗子弹没有找到任何东西 ,但是当基类Place定义接口Sparta, it gets found 以前我们认为Sparta上课。

注意,如果您创建嵌套类型Place.Sparta类而不是接口,它仍然编译和返回false-但是编译器发出警告,因为它知道Sparta将永远不是类的实例。Place.Sparta。同样的,如果你Place.Sparta接口,但使Spartasealed,你会收到警告的,因为没有Sparta实例可以实现接口。

用户回答回答于

当将名称解析为其值时,定义的“紧密性”用于解决歧义。无论什么定义“最接近”,都是被选择的定义。

接口Sparta在基类中定义。全班Sparta在包含的命名空间中定义。在基类中定义的东西比在同一个命名空间中定义的东西“更接近”。

扫码关注云+社区