0

タイトル通りにやろうとしているのですが、困っています。

デリゲートがどのように機能するかはわかりましたが、Visual Studio は私が間違っていると言っています。これを行う方法を説明している Microsoft のドキュメントには、テンプレートと一連のロジック コードを含む書店プログラムを使用する複雑な例が含まれているため、理解が困難です。

これどうやってやるの?ありがとう。

4

2 に答える 2

2

デリゲートは安全な関数ポインターです。その名前の宣言された変数にメソッドを割り当てる必要があります。実行している型自体を割り当てようとするのではありません。

class MyGameClass
{
    SetGameAreaDelegate handler;
    MyGameClass()
    {
        // Instantiate the handler (since my callback is a non-static method)
        // You'll need to preform this assignment in the constructor, 'this'
        // is not valid during initialization 
        handler = new SetGameAreaDelegate(myGameAreaWithCallback);
        handler = MyGameAreaWithCallback; // short for above
    }
    void MyGameAreaWithCallback(Game1.gameAreas newArea)
    {
        //...
    }
}

更新: デリゲートに関する詳細

デリゲートは、関数ポインターのマネージ ラッパーです。独自の型シグネチャがあり、おそらく生の関数ポインターに代わる保存手段です。デリゲートは、C++ スタイルのメンバー関数ポインターのようなインスタンス オブジェクトへの参照を保持できますが、ランタイムがこの種の情報を把握するため、これについて心配する必要はありません。

非静的メソッドへのデリゲートは、そのオブジェクトへの参照を追跡することを知っておくとよいでしょう。これにより、デリゲートは無害に見えるかもしれませんが、オブジェクト参照を維持または追跡するため、メモリがガベージ コレクションされない可能性があります。

コードの問題は、型シグネチャ...

void SetGameAreaWithCallback(Game1.gameAreas newArea, SetGameAreaDelegate callback)

...デリゲートのタイプと一致しません...

delegate void SetGameAreaDelegate(Game1.gameAreas newArea);

...これが機能するために...

SetGameAreaDelegate handler = SetGameAreaWithCallback;

...あなたのデリゲートは...

delegate void SetGameAreaDelegate(Game1.gameAreas newArea, SetGameAreaDelegate callback);

...これが本当に意図したものである場合は、パラメーターを忘れました。これが、メソッドの解決が失敗する理由です。

于 2009-02-19T06:20:01.617 に答える