尝试订阅事件时,为什么转换时出错?

时间:2019-06-26 13:56:31

标签: c#

我对活动的理解有问题。由于某些原因,我无法订阅我的活动。视觉工作室在说

  

错误CS0029无法将类型'void'隐式转换为   'FileSystemWatcher.FileSystemWatcher.Handler'FileSystemWatcher C:\ Users \ Diord \ source \ repos \ FileSystemWatcher \ FileSystemWatcher \ Program.cs 16有效

当我这样做

  

fileSystemWatcher.Changed + = ShowMessage();

class Program
{
    static void Main(string[] args)
    {
        FileSystemWatcher fileSystemWatcher = new FileSystemWatcher("C:\\");
        //next line is highlighted
        fileSystemWatcher.Changed += ShowMessage();
    }

    public void ShowMessage()
    {
        Console.WriteLine("Hello Event!");
    }
}
class FileSystemWatcher
{
    readonly string _path;

    private string[] Files { get; set; }

    public FileSystemWatcher(string path)
    {
        _path = path;
    }

    public delegate void Handler();

    public event Handler Changed;
}

2 个答案:

答案 0 :(得分:7)

您必须从ShowMessage()中删除括号,因为这是在调用函数,而不是将方法“引用”到事件。

错误消息表明,“ void”(函数的结果)不能附加到事件上。

在代码中:

fileSystemWatcher.Changed += ShowMessage;

答案 1 :(得分:0)

该错误是由于方法签名(左部分)和调用结果(右部分)之间的分配不正确引起的。省略方括号表示您对签名感兴趣,而不是有效地调用该方法。

这可以解决您的问题:

fileSystemWatcher.Changed += ShowMessage;

但是,在您的示例中,您什么也看不到,因为您的应用程序将立即退出,因为您没有消息泵或者只是您没有在等待什么。

此外,如果主线程正在等待用户输入,则您可能不会收到该事件。

请咨询FileSysteWatcher documentation,以了解如何使用它。尤其是对于线程(由于您在控制台应用程序中,因此将需要线程)。