7

In questo caso sono in esecuzione in un caso angolo relativo alla differenza con l'ambito dei metodi/proprietà dell'istanza in C#. Ecco il codice:La differenza tra il compilatore Mono C# e il compilatore MS C# rispetto all'ambito

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() 
    { 
    } 
} 

Il codice compila bene su MonoDevelop 3.0, ma dà un errore in VS2010 dicendo: è necessario un riferimento a un oggetto per il campo non statico, metodo o proprietà "Base.Execute" Fondamentalmente, si riduce al fatto che quando si richiama il costruttore della classe base dal costruttore della classe derivata, il compilatore C# di MS non consente l'accesso ai metodi/proprietà della classe derivata, ecc. In che modo?

risposta

7

Il compilatore VS segue le specifiche. Non sono sicuro di quale sia la ragione per cui è consentita l'implementazione Mono.

C# Specification, sezione 10.11.1 inizializzatori Costruttore:

un'istanza costruttore inizializzatore non può accedere l'istanza creati. Pertanto è un errore in fase di compilazione fare riferimento a questo in un'espressione argomento del programma di inizializzazione del costruttore, come è un errore in fase di compilazione per un'espressione argomento per fare riferimento a qualsiasi membro dell'istanza tramite un nome semplice.

+1

Mi sembra che sia un errore in Mono. Sospetto che sia facile rappresentarlo in IL - è una limitazione puramente C#. –

+0

Sto pensando perché questa restrizione, però, è perché quando si chiama il costruttore della classe base, la classe derivata non è ancora inizializzata e quindi non può accedere al suo membro di istanza? – imgen

+1

Si può facilmente accedere a "questo" all'interno del costruttore (inclusa la base uno - vale a dire verranno chiamate le funzioni virtuali della classe derivata). Penso che la ragione è che l'uso di questo a quel punto sarà soggetto a strane restrizioni e modifiche non correlate (ad esempio, l'inizializzazione del campo di spostamento dalla dichiarazione a un costruttore) potrebbe modificare il comportamento del codice. –