以下是面试问题。我想出了一个解决方案,但不确定为什么。

问题:

在不修改Sparta类的情况下,编写一些使MakeItReturnFalse返回false的代码。

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

我的解决方案:(SPOILER)

public class Place{ public interface Sparta { }}
但是,为什么Sparta中的MakeItReturnFalse()引用{namespace}.Place.Sparta而不是{namespace}.Sparta

最佳答案



基本上,因为这就是名称查找规则所说的。在C#5规范中,相关的命名规则在3.8节(“ namespace 和类型名称”)中。

前几对子弹-被截断和注释-阅读:



因此,如果第一个项目符号什么都没找到,那么最后一个要点就是选择Sparta类...但是当基类Place定义了一个接口(interface)Sparta时,它将在我们考虑Sparta类之前被找到。

请注意,如果将嵌套类型Place.Sparta设为类而不是接口(interface),它仍会编译并返回false-但编译器会发出警告,因为它知道Sparta的实例永远不会是Place.Sparta类的实例。同样,如果保留Place.Sparta接口(interface)但将Sparta类设为sealed,则会收到警告,因为没有Sparta实例可以实现该接口(interface)。

09-26 16:18