字段初始化程序无法引用EventHandler中的非静态字段,方法或属性

问题描述

我在行上收到以下错误(字段初始化程序无法引用EventHandler中的非静态字段,方法属性):

FilesFound = FilesFound + 1;

任何人都知道为什么以及如何解决

public class FileSearcher
{
    public event EventHandler<FileFoundArgs> FileFound;

    public int FilesFound { get; set; } = 0;
    
    EventHandler<FileFoundArgs> onFileFound = (sender,eventArgs) =>
    {
        Console.WriteLine(eventArgs.FoundFile);
        FilesFound = FilesFound + 1;
    };
    
    public FileSearcher()
    {
        FileFound += onFileFound;
    }

    public void Search(string directory,string searchPattern)
    {
        foreach (var file in Directory.EnumerateFiles(directory,searchPattern))
        {
            FileFound?.Invoke(this,new FileFoundArgs(file));
        }
    }
}

谢谢

解决方法

错误消息确切说明了问题所在-您的字段初始化器正在通过lambda表达式使用实例成员(FilesFound)。您不能在实例字段初始化程序中引用其他实例成员。

简单的解决方法是将初始化移至构造函数:

private EventHandler<FileFoundArgs> onFileFound;

public FileSearcher()
{
    onFileFound = (sender,eventArgs) =>
    {
        Console.WriteLine(eventArgs.FoundFile);
        FilesFound = FilesFound + 1;     
    };
    FileFound += onFileFound;
}

或者,如果您不打算在其他任何地方使用onFileFound,请完全放弃它作为一个字段,而直接在构造函数中订阅该事件:

private EventHandler<FileFoundArgs> onFileFound;

public FileSearcher()
{
    FileFound += (sender,eventArgs) =>
    {
        Console.WriteLine(eventArgs.FoundFile);
        FilesFound = FilesFound + 1;     
    };
}