Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 委托定义为方法';签名不是有效的替代品_C#_Delegates - Fatal编程技术网

C# 委托定义为方法';签名不是有效的替代品

C# 委托定义为方法';签名不是有效的替代品,c#,delegates,C#,Delegates,当我有以下示例代码时: 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 { publ

当我有以下示例代码时:

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
 }
}
名称空间测试{
公共委托void TestDelegate(对象发送方,MyEventArgs e);
公共A类{
公共事件处理程序;
公开无效测试(){
Handler+=B.观察;
}
}
}
公共B级{
公共无效观察(TestDelegate){
//做点什么
}
}
我得到了错误

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

然而,当我使用

Observer(对象发送者,MyEventArgs e){}


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

方法
观察者的签名与方法
事件处理程序的签名不匹配

(EventHandler是系统命名空间下的.NET委托类型)

您可以这样做:

public event TestDelegate Handler; 
而不是

public event EventHandler<MyEventArgs> Handler; //Notice the type of Handler. Its of type EventHandler defined under System namespace.
公共事件事件处理程序//请注意处理程序的类型。其类型为系统命名空间下定义的EventHandler。
定义签名:

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)
{
}

这正是你所理解的。这里的问题是您将委托用作参数。定义不是“复制的”。。。换句话说,“观察者”方法必须匹配委托的签名,而不是将委托作为参数。我使用委托的原因是将
X\u Sample\u MyEvent
中的参数替换为
TestDelegate
。这可能吗?当我这样做的时候,我得到了和以前一样的错误。@Jeroenvanevel:换句话说,委托只是一个函数指针。你指定的用法听起来无效。你从中得到了什么?@AlessandroD'Andria:你上一个建议完全符合我的要求!但是,我现在如何访问此委托参数后面的参数?@Jeroen:它们就像函数指针一样工作。不能使用“委托”代替函数参数。它们不是那样工作的。也许有一种不同的语言功能符合我的要求吗?也许这是一个X-Y问题。@Jeroenvanevel:也许您可以将方法
Observer
定义为一个委托,并将其指向另一个满足您需求的方法。而且,我真的不明白为什么您需要这个功能?或者如果您想要相同的
替换
为什么不考虑一些基于.NET的宏?