7

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?

Respuesta

7

El compilador VS sigue las especificaciones. No estoy seguro de cuál es la razón por la que está permitido en la implementación Mono.

C# Specification, sección 10.11.1 inicializadores de constructor:

Una instancia de inicialización del constructor no puede acceder a la instancia que se crearon. Por lo tanto, es un error en tiempo de compilación hacer referencia a esto en una expresión de argumento del inicializador de constructor, ya que es un error en tiempo de compilación para una expresión de argumento hacer referencia a cualquier miembro de instancia a través de un nombre simple.

+1

Me parece que es solo un error en Mono. Sospecho que es fácil de representar en IL, es una restricción puramente C#. –

+0

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

+1

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. –

Cuestiones relacionadas