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.