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)