2012-03-28 12 views
8

以下のコードでは、メソッドを宣言する必要があります。MdrResponseInterpreterstaticコンパイルエラーが発生しました。なぜデリゲートは静的でなければならないのですか?

class.... { 

    private StandardBuilder _mdrResponseBuilder = 
     new StandardBuilder(MdrResponseInterpreter); 

    public static bool MdrResponseInterpreter(DNMessageDeliverer builder, 
               DNFieldSet message) 
    { 
     // .... work 
    } 

なぜですか? _mdrResponseBuilderが静的​​ではないので、私は、フィールド初期化子がthis /インスタンスメンバへのアクセスを持っていないのでMdrResponseInterpreterthis

答えて

11

にアクセスすることができなければならないことを期待しています。インスタンスメンバーにアクセスする場合は、初期化をコンストラクタに移動します。

スペックは言う:

インスタンスフィールドの変数初期化子が作成されているインスタンスを参照することはできません。したがって、それはあなたのコードが明示的にthisを参照していませんが、変数初期化子

thisを参照するには、コンパイル時エラーで、変換を委任する方法のグループは、メソッドがインスタンスメンバの場合は、暗黙的にthisを参照しません。

1

イニシャライザでインスタンスメンバーを使用することはできません。

デリゲートは、1)オブジェクト参照と2)メソッド参照を持つと考えてください。 thisにアクセスすることはできないため、オブジェクト参照を設定する方法はないため、デリゲートとしてメソッドを使用できる唯一の方法はstaticと宣言することです(スタティックメソッドの場合、デリゲートのオブジェクト参照はnullです)。初期化をコンストラクタに移すことで、この問題を回避するのに役立ちます。

+1

その時点でオブジェクトがあります(そうでなければ、どこに値が割り当てられていますか?)が、まだ 'this'にアクセスすることはできません。 –

+0

確かに、私は不明であった。私の答えを更新しました。 – Botz3000

+0

私はまだそれが不明だと言うだろう。オブジェクト*は完全に存在します。これは完全に*初期化されていないかもしれませんが、コンストラクタ本体にも当てはまります。 (まだ実行されていない他の導出されたコンストラクタ本体があるかもしれません...) –

1

メソッドは、コンストラクターが実行を開始する前にオブジェクトの初期化時に呼び出されるため、静的でなければなりません。 thisにアクセスする場合は、コンストラクタ内部から初期化メソッドを呼び出します。

private StandartBuilder _mdrResponsBuilder; 

public Foo() // Whatever your type is called 
{ 
    // Simpler syntax for creating a delegate, too. Just use a 
    // method group conversion... 
    _mdrResponsBuilder = MdrResponseInterpreter; 
} 

EDIT:上記はStandartBuilderは、デリゲート型であることを前提とし、あなただけのコンストラクタに割り当てを移動することができます(正しいです)CodeInChaosの答えに追加するには

5

。コンストラクタがのタイプで代理人タイプを受け入れる場合は、new StandartBuilder(MdrResponseInterpreter)に戻ってコンストラクタに戻す必要があります。

+0

@Downvoter:コメントしますか? –

+0

"_mdrResponsBuilder = MdrResponseInterpreter"はどうして正しいのでしょうか?この質問には、StandardBuilderがデリゲートであることが示されていません...コンストラクタ内にFunc を受け入れるクラスである可能性がありますか? Btw、私はdownvoteしなかった – odalet

+1

@odalet:はい、可能です。私はそれがデリゲート型である可能性が高いと思っています。明確にするために編集します。 –

関連する問題