単純な 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 にトンネリングする方法はありますか? デリゲートに対して実行できる何らかの合法的なキャストはありますか?