C# 设置交通信号灯的两种不同费率时遇到问题

C# 设置交通信号灯的两种不同费率时遇到问题,c#,C#,我正在尝试制作一个红绿灯程序,它有两种不同的速率,这取决于用户想要什么(快速和慢速)。但是,由于我的两个按钮都出现了此错误,我在编译时遇到了问题: 错误CS0123:方法或委托TrafficLight.signal(对象,系统.计时器.ElapsedEventArgs)参数与委托系统.事件处理程序(对象,系统.事件参数)参数不匹配 以下是一些代码供参考: using System; using System.Drawing; using System.Windows.Forms; using S

我正在尝试制作一个红绿灯程序,它有两种不同的速率,这取决于用户想要什么(快速和慢速)。但是,由于我的两个按钮都出现了此错误,我在编译时遇到了问题:

错误CS0123:方法或委托<代码>TrafficLight.signal(对象,系统.计时器.ElapsedEventArgs)参数与委托<代码>系统.事件处理程序(对象,系统.事件参数)参数不匹配

以下是一些代码供参考:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Timers;

public class TrafficLight : Form {
    private RadioButton fast = new System.Windows.Forms.RadioButton();
    private RadioButton slow = new System.Windows.Forms.RadioButton();
    private GroupBox rateOfChange = new GroupBox();
    private static System.Timers.Timer Tclock = new System.Timers.Timer();
    private ulong tickCounter = 0;
}

public TrafficLight() {
    Tclock.Enabled = false;
    Tclock.Elapsed += new ElapsedEventHandler(signal);
    Tclock.Interval = 1000;
    //error occurs on these next two.
    fast.Click += signal;
    slow.Click += signal;

}

//same error marked here.
protected void signal(System.Object send, ElapsedEventArgs e) {
    if(send == fast) {
    tickCounter++;
    switch(Light) {
      case trafficColor.red:
      if(tickCounter > 4) {
        tickCounter = 0;
        Light = trafficColor.green;
        Invalidate();
      }
      break;
      case trafficColor.yellow:
      if(tickCounter > 1) {
        tickCounter = 0;
        Light = trafficColor.red;
        Invalidate();
      }
      break;
      case trafficColor.green:
      if(tickCounter > 3) {
        tickCounter = 0;
        Light = trafficColor.yellow;
        Invalidate();
      }
      break;
    }
    else if(send == slow) {
    tickCounter++;
    switch(Light) {
      case trafficColor.red:
      if(tickCounter > 8) {
        tickCounter = 0;
        Light = trafficColor.green;
        Invalidate();
      }
      break;
      case trafficColor.yellow:
      if(tickCounter > 2) {
        tickCounter = 0;
        Light = trafficColor.red;
        Invalidate();
      }
      break;
    case trafficColor.green:
      if(tickCounter > 6) {
        tickCounter = 0;
        Light = trafficColor.yellow;
        Invalidate();
      }
      break;
}

在导致错误的行中,您试图使用一个事件处理程序,该处理程序要求将
ElapsedEventArgs
对象作为第二个参数传递。但是,
Click
事件只能提供一个
EventArgs
对象。当鼠标点击事件发生时,它甚至不知道在哪里可以获得与计时器相关的事件args对象

另一方面,事件处理程序从未实际使用传递给它的事件args对象。而
ElapsedEventArgs
EventArgs
的一个子类。因此,您可以合法地将事件处理程序声明更改为受保护的无效信号(System.Object send,EventArgs e),并将相同的事件处理程序用于
计时器已过事件和
单击事件

这是因为具有该签名的事件处理程序可以接受传递给它的任何
EventArgs
对象作为第二个参数。它可以是一个普通的
EventArgs
对象,这将由
单击事件提供。或者它可以是
已用事件提供的
ElapsedEventArgs
对象。由于
ElapsedEventArgs
继承了
EventArgs
,因此它也是一个“
EventArgs
对象,并且也满足参数的类型要求


(以上任何一项都不应被视为认可让同一事件处理程序同时响应计时器已过事件和鼠标单击事件的设计:)

在导致错误的行上,您试图使用一个事件处理程序,该处理程序要求将
ElapsedEventArgs
对象作为第二个参数传递。但是,
Click
事件只能提供一个
EventArgs
对象。当鼠标点击事件发生时,它甚至不知道在哪里可以获得与计时器相关的事件args对象

另一方面,事件处理程序从未实际使用传递给它的事件args对象。而
ElapsedEventArgs
EventArgs
的一个子类。因此,您可以合法地将事件处理程序声明更改为受保护的无效信号(System.Object send,EventArgs e)
,并将相同的事件处理程序用于
计时器已过事件和
单击事件

这是因为具有该签名的事件处理程序可以接受传递给它的任何
EventArgs
对象作为第二个参数。它可以是一个普通的
EventArgs
对象,这将由
单击事件提供。或者它可以是
已用事件提供的
ElapsedEventArgs
对象。由于
ElapsedEventArgs
继承了
EventArgs
,因此它也是一个“
EventArgs
对象,并且也满足参数的类型要求


(以上任何一项都不应被视为认可让同一事件处理程序同时响应计时器运行事件和鼠标单击事件的设计:)

我没有仔细查看您的代码,但为了修复您引用的错误,您只需将
signal
的第二个参数的类型改为
EventArgs
?这是一个按钮单击事件,它显然不是一个
ElapsedEventHandler
。您似乎希望能够单击一个按钮并执行与计时器经过时相同的事件处理程序。您的事件处理程序似乎从未实际使用
e
参数。因此,它实际上不需要是
ElapsedEventArgs
类型。通过将方法声明更改为
受保护的无效信号(System.Object send,EventArgs e)
,您应该能够使代码正常工作。我没有仔细查看您的代码,但为了修复您引用的错误,您只需将
signal
的第二个参数的类型改为
EventArgs
?这是一个按钮单击事件,它显然不是一个
ElapsedEventHandler
。您似乎希望能够单击一个按钮并执行与计时器经过时相同的事件处理程序。您的事件处理程序似乎从未实际使用
e
参数。因此,它实际上不需要是
ElapsedEventArgs
类型。通过将方法声明更改为
protectedvoidsignal(System.objectsend,EventArgs e)
,您应该能够使代码正常工作。