我正在对一个不再受支持且已停止工作的遗留应用程序进行逆向工程,因此我可以创建一个新应用程序来执行相同的功能.我有这个类使用以下代码模式相当多.
public event myEventHandler myEvent
{
[MethodImpl(MethodImplOptions.Synchronized)]
add
{
myEvent = (myEventHandler)Delegate.Combine(myEvent, value);
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove
{
myEvent = (myEventHandler)Delegate.Remove(myEvent, value);
}
}
Run Code Online (Sandbox Code Playgroud)
但是,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;
}
}
Run Code Online (Sandbox Code Playgroud)
您正在使用该事件的属性语法.这意味着您没有定义实际的委托.您只是创建将添加和删除委托的方法.具体来说,您没有委托变量myEvent,只是为它创建添加和删除方法.这意味着你的代码......
add
{
myEvent += value;
}
Run Code Online (Sandbox Code Playgroud)
...如果允许的话,将是无限递归.为什么?,因为操作员+=转换为add对事件方法的实际调用.既然你都已经在add方法中,你实际上是在说:通过添加事件添加事件.这同样适用于-=和remove.
解决方案是为您的事件创建一个支持者字段,您可以将值分配给:
private myEventHandler _myEvent = null;
public event myEventHandler myEvent
{
[MethodImpl(MethodImplOptions.Synchronized)]
add
{
_myEvent += value;
}
[MethodImpl(MethodImplOptions.Synchronized)]
remove
{
_myEvent -= value;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,event缺少关键字_myEvent,这是故意的,因为它不是事件,而是存储事件处理程序的字段.
在你的情况下,你根本不需要属性语法,因为你所做的就是通过处理程序(因为你MethodImplAttribute不需要附加方法):
public event myEventHandler myEvent;
Run Code Online (Sandbox Code Playgroud)
并且不要使用Delegate.Combine.这是脏的,不必要的,不会解决你的问题.
| 归档时间: |
|
| 查看次数: |
1200 次 |
| 最近记录: |