Bella domanda! Vorrei aggiungere una spiegazione leggermente più lunga per coloro che non fanno C # quotidianamente ... perché la domanda è un buon promemoria dei problemi di risoluzione dei nomi in generale.
Prendi il codice originale, leggermente modificato nei seguenti modi:
- Stampiamo i nomi dei tipi invece di confrontarli come nell'espressione originale (es
return this is Sparta ).
- Definiamo l'interfaccia
Athena nella Placesuperclasse per illustrare la risoluzione del nome dell'interfaccia.
- Stampiamo anche il nome del tipo di
thiscome è associato nella Spartaclasse, solo per rendere tutto molto chiaro.
Il codice ha questo aspetto:
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));
}
}
Creiamo ora un Spartaoggetto e chiamiamo i tre metodi.
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
L'output che otteniamo è:
Sparta
Athena
Place+Athena
Tuttavia, se modifichiamo la classe Place e definiamo l'interfaccia Sparta:
public class Place {
public interface Athena { }
public interface Sparta { }
}
quindi è questa Sparta- l'interfaccia - che sarà disponibile per prima per il meccanismo di ricerca del nome e l'output del nostro codice cambierà in:
Sparta
Place+Sparta
Place+Athena
Quindi abbiamo effettivamente incasinato il confronto dei tipi nella MakeItReturnFalsedefinizione della funzione semplicemente definendo l'interfaccia di Sparta nella superclasse, che si trova prima dalla risoluzione del nome.
Ma perché C # ha scelto di dare la priorità alle interfacce definite nella superclasse nella risoluzione dei nomi? @ JonSkeet lo sa! E se leggi la sua risposta otterrai i dettagli del protocollo di risoluzione dei nomi in C #.