以下是面试问题。我想出了一个解决方案,但不确定为什么。
问题:
在不修改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)。