字段初始值设定项不能引用非静态字段、方法或 EventHandler 中的 属性
A field initializer cannot reference the non-static field, method or property in 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;
};
}
我收到以下错误(字段初始值设定项无法引用事件处理程序中的非静态字段、方法或 属性):
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;
};
}