Schöne Frage! Ich möchte eine etwas längere Erklärung für diejenigen hinzufügen, die nicht täglich C # machen ... weil die Frage eine gute Erinnerung an Probleme mit der Namensauflösung im Allgemeinen ist.
Nehmen Sie den Originalcode, der auf folgende Weise leicht modifiziert wurde:
- Drucken wir die Typnamen aus, anstatt sie wie im ursprünglichen Ausdruck (dh
return this is Sparta
) zu vergleichen.
- Definieren wir die Schnittstelle
Athena
in der Place
Oberklasse, um die Auflösung des Schnittstellennamens zu veranschaulichen.
- Drucken wir auch den Typnamen aus, der
this
in der Sparta
Klasse gebunden ist , um alles sehr klar zu machen.
Der Code sieht folgendermaßen aus:
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));
}
}
Wir erstellen nun ein Sparta
Objekt und rufen die drei Methoden auf.
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
Die Ausgabe, die wir erhalten, ist:
Sparta
Athena
Place+Athena
Wenn wir jedoch die Place-Klasse ändern und die Schnittstelle Sparta definieren:
public class Place {
public interface Athena { }
public interface Sparta { }
}
Dann ist es diese Sparta
- die Schnittstelle -, die zuerst für den Namenssuchmechanismus verfügbar ist, und die Ausgabe unseres Codes ändert sich zu:
Sparta
Place+Sparta
Place+Athena
Wir haben also den Typvergleich in der MakeItReturnFalse
Funktionsdefinition effektiv durcheinander gebracht, indem wir die Sparta-Schnittstelle in der Oberklasse definiert haben, die zuerst durch die Namensauflösung ermittelt wird.
Aber warum hat C # in der Namensauflösung in der Oberklasse definierte Schnittstellen priorisiert? @ JonSkeet weiß! Und wenn Sie seine Antwort lesen, erhalten Sie die Details des Namensauflösungsprotokolls in C #.