8

以下のコードでは、メソッドを宣言する必要がありMdrResponseInterpreter staticます。そうしないと、コンパイル エラーが発生します。

class.... {

    private StandardBuilder _mdrResponseBuilder = 
      new StandardBuilder(MdrResponseInterpreter);

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

なんで?_mdrResponseBuilder静的ではないので、MdrResponseInterpreterアクセスできるはずですthis

4

4 に答える 4

11

thisフィールド初期化子は/ インスタンス メンバーにアクセスできないためです。インスタンス メンバーにアクセスする場合は、初期化をコンストラクターに移動します。

仕様は次のように述べています。

インスタンス フィールドの変数初期化子は、作成中のインスタンスを参照できません。thisしたがって、変数初期化子で参照するのはコンパイル時エラーです

コードは明示的に を参照しませんが、メソッドがインスタンス メンバーである場合、thisメソッド グループからデリゲートへの変換は暗黙的に参照します。this

于 2012-03-28T09:19:23.383 に答える
5

CodeInChaos の答え (正しい) に追加するには、割り当てをコンストラクターに移動するだけです。

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;
}

編集: 上記はStandartBuilderデリゲート型であると想定しています。デリゲート型を受け入れるコンストラクターを持つ型の場合は、に戻る必要がありますがnew StandartBuilder(MdrResponseInterpreter)、コンストラクターにはまだあります。

于 2012-03-28T09:20:47.547 に答える
1

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

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

于 2012-03-28T09:20:14.780 に答える
1

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

于 2012-03-28T09:20:45.437 に答える