美丽的问题!对于那些每天都不使用C#的人,我想添加一个稍长的解释...因为这个问题通常可以很好地提醒您解决名称解析问题。
采用原始代码,并通过以下方式对其进行了稍微的修改:
- 让我们打印出类型名称,而不是像原始表达式(即
return this is Sparta
)中那样比较它们。
- 让我们
Athena
在Place
超类中定义接口以说明接口名称解析。
- 让我们也打印出
this
绑定在Sparta
类中的类型名称,只是为了使所有内容都清楚。
代码如下:
public class Place {
public interface Athena { }
}
public class Sparta : Place
{
public void printTypeOfThis()
{
Console.WriteLine (this.GetType().Name);
}
public void printTypeOfSparta()
{
Console.WriteLine (typeof(Sparta));
}
public void printTypeOfAthena()
{
Console.WriteLine (typeof(Athena));
}
}
现在,我们创建一个Sparta
对象并调用这三个方法。
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
我们得到的输出是:
Sparta
Athena
Place+Athena
但是,如果我们修改Place类并定义接口Sparta:
public class Place {
public interface Athena { }
public interface Sparta { }
}
那么就是这个Sparta
接口-将首先可用于名称查找机制,并且我们的代码输出将更改为:
Sparta
Place+Sparta
Place+Athena
因此,MakeItReturnFalse
仅在超类中定义Sparta接口即可有效地弄乱了函数定义中的类型比较,该 接口首先是通过名称解析找到的。
但是,为什么C#选择优先考虑名称解析中超类中定义的接口?@JonSkeet知道!而且,如果您阅读了他的回答,您将获得C#中名称解析协议的详细信息。