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