【问题标题】:Cannot implicitly convert type 'void' to System.Windows.Forms.MouseEventHandler无法将类型“void”隐式转换为 System.Windows.Forms.MouseEventHandler
【发布时间】:2015-04-26 03:30:01
【问题描述】:

在我的程序中,可以使用之前定义的文本绘制 LinkLabel。当 LinkLabel 可见时,我想在双击 LinkLabel 时打开一个新表单

这是我目前的代码:

private Graphics g;

        private int punt1 = 0;
        private int punt2 = 0;

        private void Form1_MouseUp(object sender, MouseEventArgs e)
        {
            int x = e.X;
            int y = e.Y;

            g = this.CreateGraphics();

            if (e.X > 20 && e.Y > 100)
            {
                ...

                if (rbTekst.Checked && MousePosition.X > 1000)
                {
                    string naam = tbUseCaseName.Text;
                    LinkLabel lb = new LinkLabel();
                    UseCase uc = new UseCase();
                    lb.MouseDoubleClick += uc.Show();
                    lb.Location = e.Location;
                    lb.Text = naam;
                    this.Controls.Add(lb);
                }

除了 DoubleClick 事件之外,一切都很好。我收到以下错误消息:

无法将类型“void”隐式转换为 'System.Windows.Forms.MouseEventHandler'

是否因为 Form1_MouseUpMouseEventsArgs 而发生此错误?

提前致谢!

【问题讨论】:

  • 尝试删除show - lb.MouseDoubleClick += uc.Show;上的括号
  • 这可能就足够了——很难说。 UseCase.Show的签名是什么?
  • @petelids 不:“显示”匹配委托没有过载
  • @JonSkeet 需要一个带有 'void Show(object, MouseEventsArgs)' 签名的方法
  • 我在问UseCase 中的 Show 方法是什么样的 - 你还没有向我们展示。

标签: c# mouseevent double-click


【解决方案1】:

您正在尝试将调用uc.Show();结果指定为MouseDoubleClick 事件的事件处理程序。该方法返回void,这会导致您看到错误消息。

如果UseCase.Show 的签名**与事件处理程序的预期签名匹配,您可以只分配方法本身:

lb.MouseDoubleClick += uc.Show;

考虑到您的 cmets,尽管看起来签名不匹配。在这种情况下,您可以创建一个匿名事件处理程序,它只调用您要调用的方法:

lb.MouseDoubleClick += (sender, e) =>  uc.Show();

我个人更喜欢用花括号将方法体括起来,但这不是必需的:

lb.MouseDoubleClick += (sender, e) => { uc.Show(); };

您还可以创建一个方法来处理从那里点击和调用显示:

lb.MouseDoubleClick += lb_MouseDoubleClick;
...
void lb_MouseDoubleClick(object sender, MouseEventArgs e)
{
    uc.Show();
}

** 方法的签名是该方法在访问修饰符、返回值和它接受的任何参数方面的外观。我猜ucForm 在这种情况下Show 方法返回void 并且不接受任何参数。 MouseDoubleClick 事件需要一个采用 objectMouseEventArgs 的方法。

【讨论】:

  • 访问修饰符和返回类型不是方法签名的一部分
  • @ASh - 这不是它在MSDN 上所说的 - 通过指定访问级别(如公共或私有)、可选修饰符(如抽象或密封)在类或结构中声明方法、返回值、方法名称和任何方法参数。这些部分一起就是方法的签名。
  • A return type of a method is not part of the signature of the method for the purposes of method overloading. However, it is part of the signature of the method when determining the compatibility between a delegate and the method that it points to. 好吧,我的评论在代表的情况下是题外话
  • 宾果游戏!搜索了 2 天你关于匿名事件处理程序的小评论。
猜你喜欢
  • 2013-02-22
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 2016-02-17
  • 2015-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多