web-dev-qa-db-ja.com

-event-は、+ =または-=の左側にのみ表示できます

ループにイベントがあります。同じメソッドがイベントに2回以上追加されないようにしています。 addおよびremoveアクセサーを実装しました。

ただし、次のエラーが表示されます。

ItemsProcessed can only appear on the left hand side of += or -=

同じクラス内でも、それらを呼び出そうとすると、.

ItemsProcessed(this, new EventArgs()); // Produces error

public event EventHandler ItemsProcessed
{
    add
    {
        ItemsProcessed -= value;
        ItemsProcessed += value;
    }
    remove
    {
        ItemsProcessed -= value;
    }
}
33
user76071

明示的なイベントでは、デリゲートフィールドまたはEventHandlerListなどの独自のバッキングストアを提供する必要があります。現在のコードは再帰的です。試してください:

private EventHandler itemsProcessed;
public event EventHandler ItemsProcessed
{
    add
    {
        itemsProcessed-= value;
        itemsProcessed+= value;
    }

    remove
    {
        itemsProcessed-= value;
    }
}

次に(そして私がlittleであることに注意してください "nullを回すことについて"エッジケースの再スレッド化について):

var snapshot = itemsProcessed;
if(snapshot != null) snapshot(this, EventArgs.Empty);

最近のC#バージョンでは、これを簡略化できます。

itemsProcessed?.Invoke(this, EventArgs.Empty);
29
Marc Gravell

EventHandlerを明示的に実装した場合、イベントを発生させるときに「プロパティ」を参照できないようです。バッキングストアを参照する必要があります。

9
John Robertson

派生クラスからイベントを発生させようとしているのかどうかは投稿からはわかりませんが、基本クラスでイベントを定義してから(直接)発生させることができないことがわかりました派生クラスでは、なんらかの理由でまだはっきりしていません。

したがって、次のように、基本クラスで保護された関数を定義して、これらの基本クラスで定義されているイベントを発生させます。

// The signature for a handler of the ProgressStarted event.
// title: The title/label for a progress dialog/bar.
// total: The max progress value.
public delegate void ProgressStartedType(string title, int total);

// Raised when progress on a potentially long running process is started.
public event ProgressStartedType ProgressStarted;

// Used from derived classes to raise ProgressStarted.
protected void RaiseProgressStarted(string title, int total) {
    if (ProgressStarted != null) ProgressStarted(title, total);
}

次に、派生クラスで、ProgressStarted(title、total)を呼び出す代わりに、RaiseProgressStarted(title、total)を呼び出します。

長い道のりのようです。たぶん他の誰かがこの問題を回避するより良い方法を知っています。

8
Shavais

どのエラー? yourserlfでaddとremoveを呼び出しているため(同じイベント)、スタックオーバーフローエラーが発生したと思います。また、イベントACCESSORを発生させることはできません。

これを行う有効な方法は、パブリックアクセサーから追加および削除されるバッキングプライベートイベントを作成することです。このプライベートイベントを発生させる必要があります。

ちょっと待って。

2
Euphoric