Generics C#

/*
Example code from 
Chapter 18 - Generics
C# 2.0: The Complete Reference, Second Edition
by Herbert Schildt 
McGraw-Hill/Osborne ? 2006
*/       
       
using System;
class MyEventArgs : EventArgs {
  public int eventnum;
}
delegate void MyEventHandler(T source, V args);
class MyEvent {
  static int count = 0;
  public event MyEventHandler SomeEvent;
  public void OnSomeEvent() {
    MyEventArgs arg = new MyEventArgs();
    if(SomeEvent != null) {
      arg.eventnum = count++;
      SomeEvent(this, arg);
    }
  }
}
class X {
  public void handler(T source, V arg) where V : MyEventArgs {
    Console.WriteLine("Event " + arg.eventnum + " received by an X object.");
    Console.WriteLine("Source is " + source);
    Console.WriteLine();
  }
}
class Y {
  public void handler(T source, V arg) where V : MyEventArgs {
    Console.WriteLine("Event " + arg.eventnum + " received by a Y object.");
    Console.WriteLine("Source is " + source);
    Console.WriteLine();
  }
}
class Test {
  public static void Main() {
    X ob1 = new X();
    Y ob2 = new Y();
    MyEvent evt = new MyEvent();
    evt.SomeEvent += ob1.handler;
    evt.SomeEvent += ob2.handler;
    evt.OnSomeEvent();
    evt.OnSomeEvent();
  }
}