Belle question! Je voudrais ajouter une explication un peu plus longue pour ceux qui ne font pas C # quotidiennement ... parce que la question est un bon rappel des problèmes de résolution de noms en général.
Prenez le code d'origine, légèrement modifié de la manière suivante:
- Imprimons les noms des types au lieu de les comparer comme dans l'expression d'origine (ie
return this is Sparta
).
- Définissons l'interface
Athena
dans lePlace
superclasse pour illustrer la résolution des noms d'interface.
- Imprimons également le nom du type de
this
tel qu'il est lié dans la Sparta
classe, juste pour que tout soit très clair.
Le code ressemble à ceci:
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));
}
}
Nous créons maintenant un Sparta
objet et appelons les trois méthodes.
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
Le résultat que nous obtenons est:
Sparta
Athena
Place+Athena
Cependant, si nous modifions la classe Place et définissons l'interface Sparta:
public class Place {
public interface Athena { }
public interface Sparta { }
}
alors c'est ceci Sparta
- l'interface - qui sera disponible en premier pour le mécanisme de recherche de nom et la sortie de notre code changera en:
Sparta
Place+Sparta
Place+Athena
Nous avons donc effectivement foiré la comparaison de type dans la MakeItReturnFalse
définition de fonction en définissant simplement l'interface Sparta dans la superclasse, qui se trouve d'abord par la résolution de nom.
Mais pourquoi C # a-t-il choisi de prioriser les interfaces définies dans la superclasse dans la résolution de noms? @JonSkeet le sait! Et si vous lisez sa réponse, vous obtiendrez les détails du protocole de résolution de noms en C #.