un comportamiento extraño con la C# 4.0 co- y contravarianza apoyo:co- y contravarianza errores en .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);
}
}
resultados de las TI con ArgumentException: Delegates must be of the same type.
extraño, ¿verdad? ¿Por qué Delegate.Combine()
(que se ha llamado al realizar la operación +=
en los delegados) no es compatible con co y contravariancia en tiempo de ejecución?
Además, he encontrado que el tipo de delegado de BCL System.EventHandler<TEventArgs>
no tiene una anotación contravariante en su parámetro genérico TEventArgs
! ¿Por qué? Es perfectamente legal, el tipo TEventArgs
se usa solo en la posición de entrada. Tal vez no hay ninguna anotación contravariante porque oculta muy bien el error con el Delegate.Combine()
? ;)
p.s. Todo esto afecta al VS2010 RC y versiones posteriores.
___ * * ___ Ыome – Nifle
lo siento, he cambiado configuración regional de teclado lugar equivocado ... – ControlFlow
@ControlFlow - Ver http://stackoverflow.com/questions/1120688/event-and-delegate-contravariance-in-net-4-0-and-c-4-0 - Noté este problema en la primera versión beta de VS2010. En ese punto, 'EventHandler' era contravariante w.r.t. 'TEventArgs'. Pero desde entonces ha sido cambiado de nuevo como has encontrado. –