Why do delegate arguments have to match exactly?

Michael asks,

Why do delegate arguments have to match exactly, when creating a delegate using Delegate.CreateDelegate?
Example:
delegate void SpecialEventHandler(object sender, SpecialEventArgs e);
Handler function:
void SpecialMethod(object sender, EventArgs e)
{
}
Now the following
Delegate.CreateDelegate(typeof(SpecialEventHandler), o, SpecialMethod)
fails, even though EventArgs is a direct parent of SpecialEventArgs. Shouldn't it be possible to use (safe downcast?) this method as a delegate target?

This is an interesting question. It should be possible to be able to support this, but we don't support it currently. IIRC, there's a runtime rule that says that a delegate must match exactly. The fancy name for this is delegate contravariance.

This could be something that we support in the future.