Некоторое странное поведение с поддержкой сочетанной и контравариантной поддержки С# 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()
(который вызывается при выполнении операции +=
для делегатов) не поддерживает co- и contravariance во время выполнения?
Кроме того, я обнаружил, что тип делегата BCL System.EventHandler<TEventArgs>
не имеет контравариантной аннотации на его общем параметре TEventArgs
! Зачем? Это совершенно легальный тип TEventArgs
, используемый только в позиции ввода. Может быть, нет контравариантной аннотации, потому что она прекрасно скрывает ошибку с помощью Delegate.Combine()
? ;)
p.s. Все это влияет на VS2010 RC и более поздние версии.