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?