Me estoy ejecutando en un caso de esquina aquí con respecto a la diferencia con el alcance de los métodos/propiedades de instancia en C#. Aquí está el código:La diferencia entre el compilador de Mono C# y el compilador MS C# con respecto al alcance
public class Base
{
public EventHandler Click {get;set;}
public Base(EventHandler clickHandler)
{
this.Click = clickHandler;
}
}
public class Derived: Base
{
public Derived(): base((sender, e) => Execute())
{
}
private void Execute()
{
}
}
El código compila bien en MonoDevelop 3.0, pero da un error en VS2010 diciendo: Se requiere una referencia de objeto para el campo no estático, método o propiedad "Base.Execute" Básicamente, se reduce al hecho de que cuando se llama al constructor de la clase base desde el constructor de la clase derivada, el compilador C# de MS no permite el acceso a los métodos/propiedades de la clase derivada, etc. ¿Cómo?
Me parece que es solo un error en Mono. Sospecho que es fácil de representar en IL, es una restricción puramente C#. –
Estoy pensando por qué esta restricción, ¿es porque al llamar al constructor de la clase base, la clase derivada aún no se ha inicializado y, por lo tanto, no puede acceder a su miembro de instancia? – imgen
Se puede acceder fácilmente a "esto" dentro del constructor (incluida la base uno, es decir, se llamarán las funciones virtuales de la clase derivada). Creo que la razón es que usar esto en ese momento estará sujeto a restricciones muy extrañas y cambios no relacionados (es decir, mover la inicialización del campo de la declaración a un constructor) podría cambiar el comportamiento del código. –