C# 在设置活动时遇到问题

C# 在设置活动时遇到问题,c#,events,C#,Events,在我的课堂上,我们正在学习如何使用c语言中的事件。教授希望我们为我们的机器人玩家状态设置事件。我要做的是,当我改变机器人的状态时,我希望该状态注册到一个事件方法。但我在安排活动时遇到了问题。我得到这些错误 错误1 Operator '+=' cannot be applied to operands of type 'PracticeWithEvents.Program.PlayerActions' and 'method group' 错误2 Cannot convert method gr

在我的课堂上,我们正在学习如何使用c语言中的事件。教授希望我们为我们的机器人玩家状态设置事件。我要做的是,当我改变机器人的状态时,我希望该状态注册到一个事件方法。但我在安排活动时遇到了问题。我得到这些错误

错误1

Operator '+=' cannot be applied to operands of type 'PracticeWithEvents.Program.PlayerActions' and 'method group'
错误2

Cannot convert method group 'OnIdleState' to non-delegate type 'PracticeWithEvents.Program.PlayerActions'. Did you intend to invoke the method?
我对整个事件的注册相对较新,所以我确信我做得不对。我在网上查了一下,但找不到有同样问题的人。有人能帮我理解我做错了什么吗

这是我的代码,希望有帮助

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace PracticeWithEvents
{
    class Program
    {
        /// <summary>
        /// Creating the states for the player
        /// </summary>
        public enum PlayerActions { IDLE, ATTACK, MOVE, DYING }
        /// <summary>
        /// creating our enum handler
        /// </summary>
        public static PlayerActions CurrentAction = PlayerActions.IDLE;

        static void Main(string[] args)
        {
            switch (CurrentAction)
            {
                case PlayerActions.IDLE:
                    CurrentAction += OnIdleState;
                    break;
                case PlayerActions.ATTACK:

                    break;
                case PlayerActions.MOVE:

                    break;
                case PlayerActions.DYING:

                    break;
            }
        }
        /// <summary>
        /// Logic for the Idle State
        /// </summary>
        /// <param name="e">gets the event</param>
        void OnIdleState(object sender, EventArgs e)
        {
            Console.WriteLine("IDLE");
        }
        /// <summary>
        /// Logic for the Attack State
        /// </summary>
        /// <param name="e">gets the event</param>
        void OnAttackState(object sender, EventArgs e)
        {
            Console.WriteLine("ATTACK");
        }
        /// <summary>
        /// Logic for the Move State
        /// </summary>
        /// <param name="e">gets the event</param>
        void OnMoveState(object sender, EventArgs e)
        {
            Console.WriteLine("MOVE");
        }
        /// <summary>
        /// Logic for the Dying State
        /// </summary>
        /// <param name="e">gets the event</param>
        void OnDyingState(object sender, EventArgs e)
        {
            Console.WriteLine("DYING");
        }
    }
}

要发送事件的类必须包含特定类型的事件。事件的类型由您必须在某处定义的某个委托的签名定义

然后,使用您的类或甚至是该类的某个实例的代码将向其附加处理程序。这些处理程序将在事件激发时运行。这是一种控制反转,当您的类的用户告诉它:这里,我希望您在每次触发此事件时运行我交给您的代码。这就是+=语法的来源:您可以将多个处理程序附加到给定实例的事件

最后,根据您的需要,您可以将EventArgs子类化,以便每次触发事件时都可以传递自定义值或参数,以便客户机代码提供处理程序的代码可以获取有关事件的信息。它是什么信息,取决于你的意图

此外,您似乎对动作、事件和状态之间的区别感到困惑。这些就是有限状态机行为的定义。状态机具有有限数量的状态。从一种状态到另一种状态的更改由事件定义。每个状态都有一个或多个事件,当这些事件发生时,会决定性地导致另一个定义良好的状态发生变化。在此基础上,您可以进行输入操作和退出操作。另外,您不需要正式的状态机就可以从基于事件的编程中获益

对于我来说,如何从当前代码到我刚刚编写的代码的一些工作实现有点模糊,但我想你可以理解。如果没有


希望这有帮助。

CurrentAction不是一个事件-它只是一个枚举属性。阅读添加事件。提示:步骤1是查找/定义适当的EventArgs类。PlayerActions不是事件,因此您无法订阅它。通常您会有一个类Robot/Player?这将宣布这一事件。然后,主方法将订阅这些事件。您需要创建该Robot/Player类的实例并订阅该实例的事件。与论坛网站不同,我们不使用感谢、感谢的帮助或签名。另外,您认为一旦切换完成,您的代码将执行什么操作?