美しい質問!日常的に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
オブジェクトを作成し、3つのメソッドを呼び出します。
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#で名前解決プロトコルの詳細がわかります。