定义为方法签名的委托不是有效的替代项

本文关键字:有效 方法 定义 | 更新日期: 2023-09-27 18:33:22

>当我有以下示例代码时:

namespace Test {
 public delegate void TestDelegate(object sender, MyEventArgs e);
 public class A {
  public event EventHandler<MyEventArgs> Handler;
  public void Test(){
   Handler += B.Observe;
  }
 }
}
public class B {
 public void Observe(TestDelegate) {
  // Do something
 }
}

我收到错误

"观察"匹配委托没有重载 'System.EventHandler'

但是,当我使用

Observer(object sender, MyEventArgs e){}

它工作得很好。我的理解是,委托可用于在多个位置定义方法签名,在这种情况下有什么问题?

定义为方法签名的委托不是有效的替代项

委托定义签名:

public delegate void TestDelegate(object sender, MyEventArgs e);
public event TestDelegate MyEvent;

事件的处理程序必须具有与委托相同的签名:

MyEvent += MyEventHandler;
void X_Sample_MyEvent(object sender, MyEventArgs e)
{
    ...
}

你可以传递你想要的 wathever 类型:

public delegate void AnotherDelegate();
public delegate void TestDelegate(AnotherDelegate arg);
MyEvent += X_Sample_MyEvent;
void X_Sample_MyEvent(AnotherDelegate arg) { }

或者可能是这样的:

public delegate void TestDelegate(object sender, MyEventArgs e);
MyEvent += (sender, e) =>
{
    Observe(MyEvent);
};
void Observe(TestDelegate arg)
{
}

方法Observer的签名与方法 EventHandler 的签名不匹配。

(事件处理程序是系统命名空间下的 .NET 委托类型)

你可以这样做:

public event TestDelegate Handler; 

而不是

public event EventHandler<MyEventArgs> Handler; //Notice the type of Handler. Its of type EventHandler defined under System namespace.