No, but neither does he contradict what Harlan wrote. The type
"System.EventHandler" isn't an event, it's a delegate type.
An event, on the other hand, requires a delegate type. But an event isn't
a delegate type or a delegate per se. It just _uses_ a delegate type.
An event is an encapsulation, similar to a property. In the case of the
event, it encapsulates an "add" and a "remove" method. Each method takes
as the single parameter an instance of a delegate. The semantics expected
by convention are that calling the "add" method will add the passed in
delegate to some list of delegates to invoke when the event is raised,
while the "remove" method will of course remove the passed in delegate
from that same list.
Of course, if you implement the event explicitly (you usually see
"automatic" events, which are like automatic properties in that the
compiler generates the implementation for you, but you can provide the
"add" and "remove" methods yourself, just as you can provide "get" and
"set" methods for properties), you can do whatever you like with the
delegate reference passed to your "add" and "remove" methods. But if you
don't follow the expected conventions, you'll have a seriously confused
program.
And of course, with all that in mind, you can see that when you write code
like this:
obj.MyEvent += SomeEventHandlerMethod;
...the compiler is simply automatically creating a delegate instance for
you (e.g. generating an expression like "new
EventHandler(SomeEventHandlerMethod)"), and then calling the "add" method
for the "MyEvent" event, passing the delegate reference to the method.
In fact, you can see how important events were to the C# designers. They
really want you to use them when they make sense, and they've included all
sorts of short-hand syntax to make it easier to do so.