gpt4 book ai didi

c# - Using Delegate.Combine error Event can only appear on the left-hand side of += or -=?

转载 作者:太空狗 更新时间:2023-10-30 00:49:05 26 4
gpt4 key购买 nike

我正在对不再受支持且已停止工作的遗留应用程序进行逆向工程,因此我可以创建一个新应用程序来执行相同的功能。我的此类经常使用以下代码模式。

        public event myEventHandler myEvent
{
[MethodImpl(MethodImplOptions.Synchronized)]
add
{
myEvent = (myEventHandler)Delegate.Combine(myEvent, value);
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove
{
myEvent = (myEventHandler)Delegate.Remove(myEvent, value);
}
}

但是,Visual Studio 返回错误:"myEvent 只能出现在 += 或 -="的左侧

下面的代码能解决这个错误吗? delegate.combine 和使用 += 之间有什么区别吗?

        public event myEventHandler myEvent
{
[MethodImpl(MethodImplOptions.Synchronized)]
add
{
myEvent += value;
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove
{
myEvent -= value;
}
}

最佳答案

您正在为事件使用属性语法。这意味着您没有定义实际的委托(delegate)。您只是在创建将添加和删除委托(delegate)的方法。具体来说,您没有委托(delegate)变量 myEvent,您只是为其创建添加和删除方法。这意味着您的代码...

        add
{
myEvent += value;
}

...如果允许的话,这将是一个无限递归。为什么?因为运算符 += 转换为对事件的 add 方法的实际调用。由于您 已经在 add 方法中,您实际上是在说:通过添加事件来添加事件。这同样适用于 -=remove

解决方案是为您的事件创建一个支持者字段,您可以将值分配给:

    private myEventHandler _myEvent = null;

public event myEventHandler myEvent
{
[MethodImpl(MethodImplOptions.Synchronized)]
add
{
_myEvent += value;
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove
{
_myEvent -= value;
}
}

请注意,_myEvent 中缺少 event 关键字,这是有意为之的,因为它不是事件,而是存储事件处理程序的字段。

但在您的情况下,您根本不需要属性语法,因为您所做的只是传递处理程序(假设不需要附加到方法的 MethodImplAttribute):

public event myEventHandler myEvent;

并且不要使用 Delegate.Combine。它很脏,没有必要,不会解决您的问题。

关于c# - Using Delegate.Combine error Event can only appear on the left-hand side of += or -=?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40802869/

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