In C#, are event handler arguments covariant?
- by Roger Lipscombe
Maybe covariant's not the word, but if I have a class that raises an event, with (e.g.) FrobbingEventArgs, am I allowed to handle it with a method that takes EventArgs?
Here's some code:
class Program
{
static void Main(string[] args)
{
Frobber frobber = new Frobber();
frobber.Frobbing += FrobberOnFrobbing;
frobber.Frob();
}
private static void FrobberOnFrobbing(object sender,
EventArgs e)
{
// Do something interesting. Note that the parameter is 'EventArgs'.
}
}
internal class Frobber
{
public event EventHandler<FrobbingEventArgs> Frobbing;
public event EventHandler<FrobbedEventArgs> Frobbed;
public void Frob()
{
OnFrobbing();
// Frob.
OnFrobbed();
}
private void OnFrobbing()
{
var handler = Frobbing;
if (handler != null)
handler(this, new FrobbingEventArgs());
}
private void OnFrobbed()
{
var handler = Frobbed;
if (handler != null)
handler(this, new FrobbedEventArgs());
}
}
internal class FrobbedEventArgs : EventArgs { }
internal class FrobbingEventArgs : EventArgs { }
The reason I ask is that ReSharper seems to have a problem with (what looks like) the equivalent in XAML, and I'm wondering if it's a bug in ReSharper, or a mistake in my understanding of C#.