comportamenti strani con la co- e controvarianza sostegno C# 4.0:co- e controvarianza bug in .NET 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);
}
}
risultati di con ArgumentException: Delegates must be of the same type.
Strano, non è vero? Perché Delegate.Combine()
(che è stato chiamato quando si esegue l'operazione +=
sui delegati) non supporta la co- e la controvarianza in fase di esecuzione?
Inoltre, ho trovato che il tipo di delegato BCL System.EventHandler<TEventArgs>
non ha annotazioni controvarianti sul suo parametro generico TEventArgs
! Perché? È perfettamente legale, tipo TEventArgs
utilizzato solo nella posizione di input. Forse non c'è un'annotazione controvariante perché nasconde bene il bug con lo Delegate.Combine()
? ;)
p.s. Tutto ciò influenza il VS2010 RC e le versioni successive.
___ * ___ * Ыome – Nifle
dispiace locale della tastiera, ho cambiato posto sbagliato ... – ControlFlow
@ControlFlow - Vedi http://stackoverflow.com/questions/1120688/event-and-delegate-contravariance-in-net-4-0-and-c-4-0 - Ho notato questo problema nella prima beta di VS2010. A quel punto, 'EventHandler' era controvariante w.r.t. 'TEventArgs'. Ma da allora è stato cambiato di nuovo come hai trovato. –