CS0029 C#无法将类型“ void”隐式转换为“ System.EventHandler”

时间:2019-05-06 09:55:40

标签: c#

返回错误

  

CS0029
  C#无法将类型'void'隐式转换为'System.EventHandler'

在此使用该功能:

gameTimer.Tick += UpdateScreen();

函数是:

private void UpdateScreen()
{
    if(Settings.GameOver == true)
    {
        if (Input.KeyPressed(Keys.Enter))
        {
            StartGame();
        }
    }
    else
    {
        if (Input.KeyPressed(Keys.Right) && Settings.direction != Direction.Left)
            Settings.direction = Direction.Right;
        else if (Input.KeyPressed(Keys.Left) && Settings.direction != Direction.Right)
            Settings.direction = Direction.Left;
        else if (Input.KeyPressed(Keys.Up) && Settings.direction != Direction.Down)
            Settings.direction = Direction.Up;
        else if (Input.KeyPressed(Keys.Down) && Settings.direction != Direction.Up)
            Settings.direction = Direction.Down;

        MovePlayer();
    }

    pbCanvas.Invalidate();
}

2 个答案:

答案 0 :(得分:3)

您应该为方法分配不带括号,因为您正试图分配方法的结果(由于void而没有)

该方法还必须具有正确的参数。

gameTimer.Tick += UpdateScreen;

private void UpdateScreen(object sender, EventArgs e)
{
    // ...
}

或者如果您不想更改method参数。您可以使用lambda表达式。 (这将创建一个新的委托,该委托将调用UpdateScreen方法。(wrapper)

gameTicker.Tick += (s, ee) => UpdateScreen();

答案 1 :(得分:0)

不需要括号。您也可以这样做:

gameTimer.Tick += (s, ev) => { UpdateTimer(s, ev); }

并修复UpdateTimer方法。

或者您也可以执行以下操作:

gameTimer.Tick += new EventHandler<object>(UpdateTimer);

有关与会代表的更多信息:

https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/delegates/

更多有关DispatchTimer的信息:

https://docs.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.DispatcherTimer#Windows_UI_Xaml_DispatcherTimer_Tick