一个错误:未重载'timer_Tick'与委托'System.EventHandler<object>'匹配。

3

我不确定我的代码哪里出错了,能否有人帮忙修复错误?错误出现在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,与此问题类似的名称,但该问题实际上不同。 - Reed Copsey
@ReedCopsey - 但您是否同意,根本的误解和解决方案也是相同的?DispatcherTimer.Tick是一个EventHandler,用于处理事件的方法的签名必须匹配吗? - mbeckish
@mbeckish 这是一个类似的问题,但是事件订阅是完全正确的 - 错误的是方法。而在这里则恰恰相反。虽然它们都是委托/方法语法不匹配的基本问题,但细节完全不同,因此我可以理解为什么用户会将其视为不同的问题,并且我不认为它们是“重复”的问题。 - Reed Copsey
@ReedCopsey - 仔细想想,我同意。可惜我无法取消关闭投票。 - mbeckish
4个回答

5

DispatcherTimer.Tick 是一个 EventHandler,而不是一个 EventHandler<object>

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

 timer.Tick += new EventHandler(timer_Tick);

请注意,这也可以用简短的形式来写,通常更安全:
timer.Tick += timer_Tick;

我已经尝试过了,但是出现了这个问题。没有重载 'timer_Tick' 与委托 'System.EventHandler<object>' 匹配。 - bluemagic

4

附加事件时不需要委托类型,编译器可以为您解决。请尝试使用以下方式:

timer.Tick += timer_Tick;

关于为什么您目前会收到错误,原因是EventHandler委托的声明如下:
public delegate void EventHandler<TEventArgs>(
    Object sender,
    TEventArgs e
)

这意味着你在尖括号内填写的类型代表函数中的第二个参数。

因此,当你输入 EventHandler<object>时,编译器会寻找类似于 timer_Tick(Object sender, object e) 的函数,但它没有找到,因此会出现错误。要使用完整的委托类型,它必须是EventHandler<EventArgs>


1

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

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

1

不要使用新的 EventHandler<object>,而是使用 new EventHandler。或者可以直接使用 += timer_Tick;


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接