C#:错误CS0123:x27没有重载;NewConnectionHandler';匹配委托';行动<;新连接Ventargs>';
我有以下代码:C#:错误CS0123:x27没有重载;NewConnectionHandler';匹配委托';行动<;新连接Ventargs>';,c#,C#,我有以下代码: namespace Hazel { public struct NewConnectionEventArgs { public readonly MessageReader HandshakeData; public readonly Connection Connection; public NewConnectionEventArgs(MessageReader hands
namespace Hazel
{
public struct NewConnectionEventArgs
{
public readonly MessageReader HandshakeData;
public readonly Connection Connection;
public NewConnectionEventArgs(MessageReader handshakeData, Connection connection)
{
this.HandshakeData = handshakeData;
this.Connection = connection;
}
}
}
public class UdpConnectionListener : NetworkConnectionListener
{
....
}
namespace Hazel
{
public abstract class ConnectionListener : IDisposable
{
public event Action<NewConnectionEventArgs> NewConnection;
public abstract void Start();
}
}
但我一直得到:
error CS0123: No overload for 'NewConnectionHandler' matches delegate 'Action<NewConnectionEventArgs>'
错误CS0123:“NewConnectionHandler”没有重载与委托“Action”匹配
应改为
private static void NewConnectionHandler(NewConnectionEventArgs args)
事件类型为Action no object sender
应改为
private static void NewConnectionHandler(NewConnectionEventArgs args)
事件类型为Action no object sender。您必须了解什么是委托
一个委托,就像C和C++中的函数指针一样,除了它可以包含多个函数。它还可以返回一个值,如果有多个函数,最后一个函数决定返回值
委托是一种类型,就像类、结构和枚举一样 例如:公共委托void Foo(int i);//你可以在课外活动
公共C类
{
公共静态无效F(int i)
{
}
}
Foo-Foo=null;
foo+=C.F;//在foo中添加C.F
foo+=C.F;//第二次在foo中添加C.F
foo+=委托(inti){};//将匿名函数添加到foo
foo+=(i)=>{};//将匿名函数添加到foo
foo();//调用foo()中的所有函数
如果要创建委托并立即为其分配函数,我们可以节省时间:
MyDelegate delegate=新的MyDelegate(MyFunction);
//与
MyDelegate=MyFunction;
System.Action
和System.Func
只是从.NET 2开始在.NET中预定义的为数不多的通用委托的集合,以帮助我们。其定义如下:
公共委托无效操作();
公共代表无效行动(T1);
公开代表无效行动(T1、T2);
//…直到17日
公共委托TResult Func();
公共代表TResult行动(T1);
公共代表TResult行动(T1、T2);
//…直到17日
事件只是一个委托,有一个重要的区别:可以从事件中添加和删除方法,但可以重新分配给所有方法。为什么?以上一个例子为例:
公共委托void Foo(int i);//你可以在课外活动
公共C类
{
公共静态无效F(int i)
{
}
}
Foo-Foo=null;
foo+=C.F;
foo+=C.F;
foo+=委托(inti){};
foo=(i)=>{};//哎呀,`=`而不是`+=`
foo();//调用foo()中的所有函数-但它们只是最后一个,是否覆盖了前一个!
这通常很有用,但可能会导致事件出错。使用C#事件,我们可以使其成为编译错误:
公共委托void Foo(int i);//你可以在课外活动
公共C类
{
public static event Foo E;//不能在类之外-事件不是类型,而是委托的实例
公共静态无效F(int i)
{
}
}
C.E+=C.F;
C.E+=C.F;
C.E+=代表(int i){};
C.E=(i)=>{};/编译错误!
foo();//调用foo()中的所有函数;
System.EventHandler
和System.EventHandler
是事件的有用代理:
public委托void EventHandler(对象发送方,EventArgs e);
公共委托void EventHandler(对象发送方,TEventArgs e);
这是.NET中事件的常见模式(发送发送方和System.EventArgs
的子类),尽管没有人强制这样做
从上面的解释中,您可以理解代码的错误。您的代码使用System.Action
定义了一个事件,那么您就没有sender
:
公共事件行动新连接;
您真正想要的是System.EventHandler
:
公共事件事件处理程序NewConnection;
您必须了解什么是委托
一个委托,就像C和C++中的函数指针一样,除了它可以包含多个函数。它还可以返回一个值,如果有多个函数,最后一个函数决定返回值
委托是一种类型,就像类、结构和枚举一样 例如:公共委托void Foo(int i);//你可以在课外活动
公共C类
{
公共静态无效F(int i)
{
}
}
Foo-Foo=null;
foo+=C.F;//在foo中添加C.F
foo+=C.F;//第二次在foo中添加C.F
foo+=委托(inti){};//将匿名函数添加到foo
foo+=(i)=>{};//将匿名函数添加到foo
foo();//调用foo()中的所有函数
如果要创建委托并立即为其分配函数,我们可以节省时间:
MyDelegate delegate=新的MyDelegate(MyFunction);
//与
MyDelegate=MyFunction;
System.Action
和System.Func
只是从.NET 2开始在.NET中预定义的为数不多的通用委托的集合,以帮助我们。其定义如下:
公共委托无效操作();
公共代表无效行动(T1);
公开代表无效行动(T1、T2);
//…直到17日
公共委托TResult Func();
公共代表TResult行动(T1);
公共代表TResult行动(T1、T2);
//…直到17日
事件只是一个委托,有一个重要的区别:可以从事件中添加和删除方法,但可以重新分配给所有方法。为什么?以上一个例子为例:
公共委托void Foo(int i);//你可以在课外活动
公共C类
{
公共静态无效F(int i)
{
}
}
Foo-Foo=null;
foo+=C.F;
foo+=C.F;
foo+=委托(inti){};
foo=(i)=>{};//哎呀,`=`而不是`+=`
foo();//调用foo()中的所有函数-但它们只是最后一个,是否覆盖了前一个!
这通常很有用,但可能会导致事件出错。使用C#事件,我们可以使其成为编译错误:
公共委托void Foo(int i);//你可以在课外活动
公共C类
{
public static event Foo E;//不能在类之外-事件不是类型,而是委托的实例
公共静态无效F(int i)
{
}
}
C.E+=C.F;
C.E+=C.F;
C.E+=代表(int i){};
C.E=(i)=>{}//
private static void NewConnectionHandler(NewConnectionEventArgs args)