Bela pergunta! Gostaria de adicionar uma explicação um pouco mais longa para quem não faz C # diariamente ... porque a pergunta é um bom lembrete dos problemas de resolução de nomes em geral.
Pegue o código original, ligeiramente modificado das seguintes maneiras:
- Vamos imprimir os nomes dos tipos em vez de compará-los como na expressão original (ie
return this is Sparta
).
- Vamos definir a interface
Athena
na Place
superclasse para ilustrar a resolução do nome da interface.
- Vamos também imprimir o nome do tipo
this
como está vinculado na Sparta
classe, apenas para deixar tudo muito claro.
O código fica assim:
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));
}
}
Agora criamos um Sparta
objeto e chamamos os três métodos.
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
A saída que obtemos é:
Sparta
Athena
Place+Athena
No entanto, se modificarmos a classe Place e definirmos a interface Sparta:
public class Place {
public interface Athena { }
public interface Sparta { }
}
então é isso Sparta
- a interface - que estará disponível primeiro para o mecanismo de pesquisa de nome e a saída do nosso código será alterada para:
Sparta
Place+Sparta
Place+Athena
Então, nós estragamos efetivamente a comparação de tipos no MakeItReturnFalse
definição de função, apenas definindo a interface Sparta na superclasse, que é encontrada primeiro pela resolução de nomes.
Mas por que o C # optou por priorizar as interfaces definidas na superclasse na resolução de nomes? @JonSkeet sabe! E se você ler a resposta dele, obterá os detalhes do protocolo de resolução de nomes em C #.