This is true of ALL derived classes of EventArgs, although I can see how, for example, a mouse related event args can be assumed to contain data you need ( although this is often not true, if I handle the mouse left button click event, I don't often care about anything passed in ) The only place I can think of where this is almost sure to not be the case, is keyboard events, where usually I want to know what key was pressed. It is for this reason that I've never tried to use KeyEventArgs.Empty, that is, assuming I were to forget that the construct as a whole is useless.
In the same way when I use Bitmap.FromFile in C# in general, I need to cast the Image that is returned, to a Bitmap. This is because it's calling a base method, I guess. That makes sense, but then why not make the base method return a Bitmap, given that you can't alter a method by return type, however, if I called Image.FromFile and got back a Bitmap, I could quite happily assign the value to an Image, and it would downcast. In fact, all things being equal, it's possible that the class always returns a Bitmap, but always specifies an Image as the return type.
Yes, I am right. The Image.FromFile ultimately calls this:
internal static Image CreateImageObject(IntPtr nativeImage)
The return type here is an Image. Bitmap.FromGDIplus looks like this:
internal static Bitmap FromGDIplus(IntPtr handle)
Bitmap bm = (Bitmap) Bitmap.FromFile(@"c:\Image.jpg");
Is that really the best we can do ?