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的宏?