0

このコードの何が問題なのか本当にわかりません。いくつかのエラーをスローしています:

エラー CS0079: イベントはor演算子core.Events.Event.thisEventの左側にのみ表示できます+=-=

エラー CS0070: イベントは、型core.Events.Event.thisEventの左側にのみ表示される+=-=、型の外側で使用される場合に のみ表示されますcore.Events.Event

エラー CS1502: の最適なオーバーロードされたメソッドの一致に System.Delegate.Combine(System.Delegate, System.Delegate)無効な引数が含まれています

エラー CS1503: 引数は式を型 #1に変換できませんobjectSystem.Delegate

私は何を間違っていますか?どうすれば修正できますか?

using System;
using System.Runtime.CompilerServices;

namespace core.Events
{
    public class Event
    {
        public delegate void EventDelegate (object from,EventArgs args);

        public event Event.EventDelegate thisEvent {
            [MethodImpl(MethodImplOptions.Synchronized)]
            add {
                this.thisEvent += (Event.EventDelegate)Delegate.Combine (this.thisEvent, value);
            }
            [MethodImpl(MethodImplOptions.Synchronized)]
            remove {
                this.thisEvent -= (Event.EventDelegate)Delegate.Remove (this.thisEvent, value);
            }
        }

        public void call (object from, EventArgs args)
        {
            this.thisEvent (from, args);
        }
    }
}

助けてくれてありがとう、私はとても疲れていて、情報源に迷っていると思います...

4

1 に答える 1

2

これは、プロパティのゲッターでプロパティの名前を使用するのと同様の間違いです。これは通常SOを引き起こしますが、この間違いは早期に発見されます。デリゲートを格納するプライベート バッキング フィールドを作成する必要があります。アクセサーを明示的に記述しても、コンパイラはそれを自動生成しなくなりました。したがって:

    private EventDelegate eventImpl;

    public event Event.EventDelegate thisEvent {
        [MethodImpl(MethodImplOptions.Synchronized)]
        add {
            this.eventImpl += value;
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        remove {
            this.eventImpl -= value;
        }
    }

    public void call(object from, EventArgs args) {
        var handler = this.eventImpl;
        if (handler != null) handler(from, args);
    }

call() の実装に注意してください。これにより、誰もイベントをサブスクライブしなかった場合のクラッシュと、スレッドがイベントのサブスクライブを解除した場合の別のクラッシュが回避されます。また、ショートカット表記を使用して、Delegate.Combine() を明示的に呼び出さないようにしました。このコードは、アクセサーを使用しない場合にコンパイラが自動生成するものと実際には変わらないことに注意してください。

于 2012-07-24T23:28:27.443 に答える