【问题标题】:An error No overload for 'timer_Tick' matches delegate 'System.EventHandler<object>'错误“timer_Tick”没有重载与委托“System.EventHandler<object>”匹配
【发布时间】:2013-02-25 20:42:24
【问题描述】:

我不确定我的代码有什么问题,有人可以帮助解决错误吗?错误在timer.Tick() 行中。它应该是一个秒表。

namespace App3
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {                
            this.InitializeComponent();
        }
        private int myCount;

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            DispatcherTimer timer = new DispatcherTimer();
            timer.Tick += new EventHandler<object>(timer_Tick);
            timer.Interval = TimeSpan.FromSeconds(5);
            timer.Start();    
        }


        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            base.OnNavigatedFrom(e);
        }

        private void timer_Tick(object sender, EventArgs e)
        {
            myCount++;
            Label.Text = myCount.ToString();
        }
    }

【问题讨论】:

  • @mbeckish 与此问题类似,但该问题的实际问题不同。
  • @ReedCopsey - 但是你不同意潜在的误解和解决方案也是一样的吗? DispatcherTimer.Tick 是一个EventHandler,选择处理事件的方法的签名必须匹配?
  • @mbeckish 这是一个类似的问题,但那里的事件订阅非常好 - 这是不正确的方法。这里恰恰相反。当然,它们是委托/方法语法不匹配的相同潜在问题,但细节完全不同,所以我会理解为什么用户会将这些视为不同的问题,我不会将它们视为“重复”问题.
  • @ReedCopsey - 再三考虑,我同意。太糟糕了,我无法取消投票。

标签: c#


【解决方案1】:

DispatcherTimer.TickEventHandler,而不是 EventHandler&lt;object&gt;

您需要更改代码以正确指定:

 timer.Tick += new EventHandler(timer_Tick);

请注意,这也可以写成简短的形式,通常更安全:

timer.Tick += timer_Tick;

【讨论】:

  • 我试过了,但弹出了这个。 'timer_Tick' 没有重载匹配委托 'System.EventHandler
【解决方案2】:

附加事件时不需要委托类型,编译器可以为您解决。试试这个:

timer.Tick += timer_Tick;

至于目前为什么会报错,EventHandler 委托是这样声明的:

public delegate void EventHandler<TEventArgs>(
    Object sender,
    TEventArgs e
)

这意味着您放在括号中的类型代表函数中的第二个参数。

因此,当您键入 EventHandler&lt;object&gt; 时,编译器会查找类似 @​​987654325@ 的函数,但它没有找到,因此会出现错误。要使用完整的委托类型,它必须是 EventHandler&lt;EventArgs&gt;

【讨论】:

    【解决方案3】:

    不要使用新的EventHandler&lt;object&gt;,而是使用new EventHandler。或者直接输入+= timer_Tick;

    【讨论】:

      【解决方案4】:

      我通过两个小改动解决了同样的问题:

      1) 将第二个参数更改为对象类型:

      取而代之的是:

      private void timer_Tick(object sender, EventArgs e)
      

      使用这个:

      private void timer_Tick(object sender, **object** e)
      

      2) 简化

      取而代之的是:

      timer.Tick += new EventHandler<object>(timer_Tick);
      

      使用这个:

      timer.Tick += timer_Tick;  // as suggested by WildCrustacean above
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多