在C#中,事件处理程序参数是否反对?

Rog*_*mbe 1 c# events contravariance

如果我有一个引发事件的类,使用(例如)FrobbingEventArgs,我是否可以使用带有EventArgs的方法来处理它?

这是一些代码:

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 { }
Run Code Online (Sandbox Code Playgroud)

我问的原因是ReSharper似乎在XAML中遇到(看起来像)等效的问题,我想知道它是否是ReSharper中的错误,或者是我对C#的理解错误.

Eri*_*ert 6

也许covariant不是这个词

关.你正在寻找的词是逆变的.将方法组转换为委托类型在返回类型中是协变的,在形式参数类型中是逆变的.

这是我关于这个主题的博客文章:

http://blogs.msdn.com/ericlippert/archive/2007/10/19/covariance-and-contravariance-in-c-part-three-member-group-conversion-variance.aspx

如果我有一个引发事件的类,使用(例如)FrobbingEventArgs,我是否可以使用带有EventArgs的方法来处理它?

嗯,你尝试了它并且它有效,所以显然是的.有关规范中的理由,请参阅标题为"方法组转换"的部分.