programming novedades guide c# language-design

novedades - c# roslyn



¿Qué quiere decir Eric Lippert con "necesitas saber cuál es la clase base para determinar cuál es la clase base"? (2)

Esto puede suceder en escenarios complicados con genéricos, herencia y clases anidadas:

class Base<T> { public class Inner {} } class Derived : Base<Derived.Inner2> { public class Inner2 : Inner {} }

Result

  • Para determinar la clase base de Derived , debemos vincular Derived.Inner2 .
  • Para enlazar Derived.Inner2 , necesitamos resolver el símbolo Inner .
  • El símbolo Inner se hereda de la clase base de su ámbito de contenido, por lo que necesitamos determinar la clase base de Derived nuevamente.

Acabo de leer este interesante artículo de Eric Lippert, Top 10 Worst C # Features . Cerca del final dice:

Las reglas para resolver nombres después de los dos puntos mencionados anteriormente no están bien fundadas; puede terminar en situaciones en las que necesita saber qué es la clase base para determinar qué es la clase base.

Por dos puntos se refiere al operador de herencia (por ejemplo, Dog : Animal ).

¿A qué situación se refiere Eric? ¿Alguien puede proporcionar un ejemplo de código?


SLaks da una buena respuesta; ver mis comentarios para algunas notas adicionales.

Como dije en los comentarios, estoy buscando mis notas antiguas sobre este tema y, si las encuentro, escribiré un blog. Aquí hay un divertido ejemplo adicional. Este programa es legal. ¿Los significados de N en la declaración de clase y la declaración de campo son iguales o diferentes? Si son iguales, ¿qué es una expresión de tipo totalmente calificada para ellos? Si son diferentes, ¿por qué la especificación exige que sean diferentes?

public class N {} public class B<T> { public class N {} } public class D : B<N> // base class { N n; // field }

Esto ilustra el problema fundamental: la búsqueda de nombres requiere que se conozca la clase base, pero la clase base se busque por nombre.

Ahora piensa en cómo funcionan las interfaces en la mezcla. Supongamos que la clase D también implementa una interfaz IN , anidada de forma similar en B y disponible globalmente. ¿La búsqueda de interfaz se resuelve en la clase base o en el espacio de nombres global? Estos son el tipo de preguntas que debe resolver cuando escribe un compilador.