0

単純な EventArgs サブクラスがあるとします。

class MyArgs : EventArgs { }

イベントを持つ 2 つのクラスがあるとします。

class MyData {
    public event EventHandler<MyArgs> Method;
}

class MyObject {
    public event EventHandler Method;
}

そして、それらを使用する簡単なプログラム:

    static void Main(string[] args){

        MyObject o = new MyObject();
        o.Method += MyMethod;

        MyData data = new MyData();
        data.Method += MyMethod;

    }

    static void MyMethod(object sender, EventArgs e) { }

反変性のおかげで、MyMethod は EventHandler と EventHandler<MyArgs> の両方としてカウントされます。ただし、MyObject のイベント ハンドラーを、メソッドを MyData に転送するプロパティに変更すると、次のようになります。

class MyObject {

    MyData data = new MyData();

    public event EventHandler Method {
        add { data.Method += value; }
        remove { data.Method += value; }
    }

}

イベント プロパティは、EventHandler を EventHandler に転送できません。これは、反変性のカテゴリに分類されるように思われるため、私には奇妙に思えます。より弱い署名 (基本クラス) を持つハンドラーは、より強い署名 (サブクラス) を持つ引数を受け入れることができるはずです。

C# でこれができないのはなぜですか? 一般的な EventHandler をイベント プロパティを通じて EventHandler にトンネリングする方法はありますか? デリゲートに対して実行できる何らかの合法的なキャストはありますか?

4

1 に答える 1

1

EventHandlerからへの暗黙的な変換はありませんEventHandler<T>。ただし、どちらも互いに互換性のある型であるEventHandlerため、をコンストラクターに渡して「変換」することができます。

public event EventHandler Method
{
    add { data.Method += new EventHandler<MyArgs>(value); }
    remove { data.Method -= new EventHandler<MyArgs>(value); }
}
于 2010-08-28T04:13:06.927 に答える