我正在对一个不再受支持且已停止工作的遗留应用程序进行逆向工程,因此我可以创建一个新应用程序来执行相同的功能。我有这个类,它使用了以下代码模式。
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 can only appear on the left-hand side of += or -="
以下代码是否可以解决此错误? delegate.combine与使用+=
之间有什么区别吗?
public event myEventHandler myEvent
{
[MethodImpl(MethodImplOptions.Synchronized)]
add
{
myEvent += value;
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove
{
myEvent -= value;
}
}
答案 0 :(得分:6)
您正在使用该事件的属性语法。这意味着您不定义实际的委托。您只是创建将添加和删除委托的方法。具体而言,您没有委托变量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;
}
}
请注意,event
上缺少_myEvent
关键字,这是有意的,因为它不是事件,而是存储事件处理程序的字段。
在您的情况下,您根本不需要属性语法,因为您只需要通过处理程序(因为不需要附加到方法的MethodImplAttribute
):
public event myEventHandler myEvent;
不要使用Delegate.Combine
。它很脏,没必要,也无法解决你的问题。