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 Place
superclasse per illustrare la risoluzione del nome dell'interfaccia.
- Stampiamo anche il nome del tipo di
this
come è associato nella Sparta
classe, 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 Sparta
oggetto 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 MakeItReturnFalse
definizione 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 #.