7

ここでは、C#のインスタンスメソッド/プロパティのスコープとの違いについて、コーナーケースで実行しています。ここでは、コードは次のとおりです。スコープに関するモノラルC#コンパイラとMS C#コンパイラの違い

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

コードは、MonoDevelopの3.0上の罰金コンパイルが、言ってVS2010でエラーを与える: オブジェクト参照が非静的フィールド、メソッド、またはプロパティ「Base.Execute」のために必要です 基本的に、派生クラスのコンストラクタから基本クラスのコンストラクタを呼び出すと、MSのC#コンパイラは派生したクラスのメソッド/プロパティなどへのアクセスを許可しないという事実にまでわかります。

答えて

7

VSコンパイラが仕様に従います。 Monoの実装で許可される理由がわからない

C# Specification、セクション10.11.1コンストラクタ初期化子:

インスタンスコンストラクタ初期化子が作成されているインスタンスにアクセスすることはできません。したがって、コンストラクター初期化子の引数式でこれを参照するのはコンパイル時エラーです。単純な名前でインスタンスメンバーを参照する引数式のコンパイル時エラーです。

+1

Monoのバグのように聞こえます。私はそれがILで表現するのは簡単だと思う - 純粋にC#の制限だ。 –

+0

私は基本クラスのコンストラクタを呼び出すと、派生クラスがまだ初期化されていないため、そのインスタンスメンバにアクセスできないので、なぜこの制限があるのだろうと思っていますか? – imgen

+1

コンストラクタ内の "this"に簡単にアクセスできます(基本クラスを含む - つまり、派生クラスの仮想関数が呼び出されます)。その理由は、その時点でこれを使用することは、非常に奇妙な制限や無関係な変更(つまり、宣言からコンストラクタへのフィールドの初期化の移動)によって、コードの動作が変更される可能性があるからです。 –