对事件使用Action <T>

时间:2019-08-29 03:52:46

标签: c# events

我正在尝试根据以下说明实施简单的事件订阅:

编写具有以下条件的在线出勤程序:

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

  • Jack,Steven和Mathew被禁止加入该组织。因此,当任何用户输入用户名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>" 

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

使用括号时,表示正在调用方法。方法调用返回值,因此在赋值中,它使用该方法返回的值,这是您不需要的。

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

user.bannedUser += OnBannedName;