Un comportement étrange avec le support C# 4.0 co- et contravariance :
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);
}
}
Ce sont les résultats avec ArgumentException: Delegates must be of the same type.
C'est étrange, n'est-ce pas ? Pourquoi Delegate.Combine()
(qui est appelé lors de l'exécution de +=
sur les délégués) ne supporte pas la co- et la contravariance au moment de l'exécution ?
De plus, j'ai trouvé que le BCL System.EventHandler<TEventArgs>
Le type de délégué n'a pas d'annotation contravariante sur son générique. TEventArgs
paramètre ! Pourquoi ? C'est parfaitement légal, TEventArgs
type utilisé uniquement à la position d'entrée. Peut-être qu'il n'y a pas d'annotation contravariante parce qu'elle cache joliment le bug avec l'annotation Delegate.Combine()
? ;)
p.s. Tout ceci concerne les versions VS2010 RC et ultérieures.