Hermosa pregunta! Me gustaría agregar una explicación un poco más larga para aquellos que no hacen C # a diario ... porque la pregunta es un buen recordatorio de los problemas de resolución de nombres en general.
Tome el código original, ligeramente modificado de las siguientes maneras:
- Imprimamos los nombres de los tipos en lugar de compararlos como en la expresión original (es decir
return this is Sparta
).
- Definamos la interfaz
Athena
en la Place
superclase para ilustrar la resolución del nombre de la interfaz.
- Imprimamos también el nombre del tipo,
this
ya que está vinculado en la Sparta
clase, solo para aclararlo todo.
El código se ve así:
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));
}
}
Ahora creamos un Sparta
objeto y llamamos a los tres métodos.
public static void Main(string[] args)
{
Sparta s = new Sparta();
s.printTypeOfThis();
s.printTypeOfSparta();
s.printTypeOfAthena();
}
}
El resultado que obtenemos es:
Sparta
Athena
Place+Athena
Sin embargo, si modificamos la clase Place y definimos la interfaz Sparta:
public class Place {
public interface Athena { }
public interface Sparta { }
}
entonces es esto Sparta
, la interfaz, lo que estará disponible primero para el mecanismo de búsqueda de nombres y la salida de nuestro código cambiará a:
Sparta
Place+Sparta
Place+Athena
Por lo tanto, nos hemos equivocado con la comparación de tipos en la MakeItReturnFalse
definición de la función simplemente definiendo la interfaz Sparta en la superclase, que se encuentra primero por la resolución de nombre.
Pero, ¿por qué C # eligió priorizar las interfaces definidas en la superclase en la resolución de nombres? @JonSkeet lo sabe! Y si lee su respuesta, obtendrá los detalles del protocolo de resolución de nombres en C #.