C# 对事件使用操作

C# 对事件使用操作,c#,events,C#,Events,我正试图根据以下说明实现一个简单的事件订阅: 在以下条件下编写在线考勤程序: 用户提供他们的姓名作为输入,然后应用程序显示消息“欢迎使用他们的姓名” 杰克、史蒂文和马修被禁止参加该组织。因此,当任何用户输入Jack、Steven和Mathew作为用户名时,应用程序应发出事件和火警警报,并向管理部门发送电子邮件 以下是我带来的: using System; namespace EventPlay { class Program { static void Main

我正试图根据以下说明实现一个简单的事件订阅:

在以下条件下编写在线考勤程序:

用户提供他们的姓名作为输入,然后应用程序显示消息“欢迎使用他们的姓名”

杰克、史蒂文和马修被禁止参加该组织。因此,当任何用户输入Jack、Steven和Mathew作为用户名时,应用程序应发出事件和火警警报,并向管理部门发送电子邮件

以下是我带来的:

using System;

namespace EventPlay
{
    class Program
    {
        static void Main(string[] args)
        {
            User user = new User();
            user.bannedUser += OnBannedName();
            user.newUser();
        }

        public void OnBannedName(string n)
        {
            Console.WriteLine("{0} Users Found. Sending Email to Administration.", n);
            Console.WriteLine("Email Sent.");
            Console.WriteLine("Warning Alarm Started.");
        }
    }
    class User
    {
        public event Action<string> bannedUser;
        public string Name;

        public void newUser()
        {
            Console.WriteLine("Hello, What is your name ?");
            Name = Console.ReadLine();

            if ((Name == "Jack" || Name == "Steven" || Name == "Mathew"))
            {
                bannedUser(Name);
            }
            else
            {
                Console.WriteLine($"Hello {Name}!");
            }

        }

    }
}
我遇到了以下错误,不明白为什么他们都无法更正我的代码

第10行

"Cannot implicitly convert type 'void' to 'System.Action<string>" 

非常感谢您的帮助。

当您使用括号时,表示您正在调用方法。方法调用返回值,因此在赋值中它使用方法返回的值,而您不希望使用该值

您需要的是分配方法本身,这是通过在不带括号的情况下写入方法名称来完成的,因此您的代码应该是:

user.bannedUser += OnBannedName;

您在该行OnBannedName上调用OnBannedName,而不是引用该函数。如果将函数名放在括号内,则相当于新建ActionOnBannedName,也就是说,将对OnBannedName委托的引用添加到事件中,而不是尝试添加从函数返回的内容。删除括号:user.bannedUser+=OnBannedName;。对于paranetheses,您调用函数而不是引用它。