gpt4 book ai didi

c# - 如果我在 C# 中重载添加和删除,为什么我不能引发或调用事件

转载 作者:行者123 更新时间:2023-11-30 15:37:10 25 4
gpt4 key购买 nike

同时为 RelayCommand 复制代码来自 Josh Smith 的文章,我复制了以下代码

public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}

然后看完this answer on SO我还在类里面复制了 Prism 的 DelegateCommand 类中的代码。

protected void NotifyCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}

但是他在 NotifyCanExecuteChanged 方法中给我一个错误

The event 'CanExecuteChanged' can only appear on the left hand side of += or -=

如果我从事件中删除添加和删除重载,则不会出现此错误。有人可以帮我理解这背后的原因吗?

最佳答案

使用类似字段的事件(这是没有 add/remove 的简单表单的名称,然后当您执行 if(CanExecuteChanged != null )CanExecuteChanged(this, ...)CanExecuteChanged 指的是 backing field,它是一个委托(delegate)字段EventHandler 类型。您可以调用委托(delegate)字段。但是,在您的示例中情况并非如此,因为没有明显的东西可以调用。肯定没有本地字段,并且转发事件 (CommandManaged.RequerySuggested) 本质上不公开任何“调用”功能。

基本上,要使其正常工作,您需要访问调用机制。最常见的是,我希望采用以下形式:

CommandManager.OnRequerySuggested();

但是如果有一个调用此事件的方法(并且不需要),它可以被称为任何

(On* 是“引发此事件”API 的常见模式,如果它是多态的,则加倍如此)

关于c# - 如果我在 C# 中重载添加和删除,为什么我不能引发或调用事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12912941/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com