C# 4.0 の共変性と反変性のサポートによる奇妙な動作:
using System;
class Program {
static void Foo(object x) { }
static void Main() {
Action<string> action = _ => { };
// C# 3.5 supports static co- and contravariant method groups
// conversions to delegates types, so this is perfectly legal:
action += Foo;
// since C# 4.0 much better supports co- and contravariance
// for interfaces and delegates, this is should be legal too:
action += new Action<object>(Foo);
}
}
での結果ですArgumentException: Delegates must be of the same type.
奇妙ですね。Delegate.Combine()
(デリゲートで操作を実行するときに呼び出される+=
) が実行時に共変性と反変性をサポートしないのはなぜですか?
さらに、BCL のデリゲート型には、そのジェネリックパラメーターSystem.EventHandler<TEventArgs>
に反変の注釈がないことがわかりました。TEventArgs
なんで?これは完全に合法で、TEventArgs
入力位置でのみ使用される型です。Delegate.Combine()
?でバグをうまく隠しているため、反変の注釈がない可能性があります。;)
ps これはすべて、VS2010 RC 以降のバージョンに影響します。