According to MSDN documentation delegates in event handlers support contravariance, for example you can use one event handler with EventArgs
as its generic parameter of EventHandler<T>
for different event that has other parameter:
static class Program
{
static void Main()
{
var a = new A();
a.event1 += a_event1;
a.event2 += a_event1;
}
static void a_event1(object sender, EventArgs e)
{}
}
public class A
{
public event EventHandler<EventArgs> event1;
public event EventHandler<EventArgsDerived> event2;
}
public class EventArgsDerived : EventArgs
{}
I noticed that EventHandler
definition is :
public delegate void EventHandler<TEventArgs>(object sender, TEventArgs e);
and generic TEventArgs
parameter is defined without using an in Keyword.
So how contravariance is supported and how compiler accepts base class parameter of type EventArgs
for event handler?