C# 使用委托.Combine错误事件只能出现在+;=或者-=?

C# 使用委托.Combine错误事件只能出现在+;=或者-=?,c#,asp.net,C#,Asp.net,我正在对一个不再受支持且已停止工作的遗留应用程序进行反向工程,以便创建一个新的应用程序来执行相同的功能。我有一个类,它经常使用下面的代码模式 public event myEventHandler myEvent { [MethodImpl(MethodImplOptions.Synchronized)] add { myEvent = (myEventHand

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

        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;
            }
        }

您正在为事件使用属性语法。这意味着您不是在定义实际的代理。您只是在创建将添加和删除委托的方法。具体地说,您没有委托变量
myEvent
,您只是为它创建了add和remove方法。这意味着你的代码

        add
        {
            myEvent += value;
        }
…将是一个无限递归,如果允许的话。为什么?因为操作符
+=
转换为对事件的
add
方法的实际调用。由于您已经使用了
add
方法,实际上您是在说:通过添加事件来添加事件。这同样适用于
-=
删除

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

    private myEventHandler _myEvent = null;

    public event myEventHandler myEvent
    {
        [MethodImpl(MethodImplOptions.Synchronized)]
        add
        {
            _myEvent += value;
        }
        [MethodImpl(MethodImplOptions.Synchronized)]
        remove
        {
            _myEvent -= value;
        }
    }
请注意,
\u myEvent
上缺少
事件
关键字,这是故意的,因为它不是事件,而是存储事件处理程序的字段

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


不要使用
委托。合并
。它脏兮兮,没有必要,也无法解决您的问题。

@HuwD是的,您可以使用
+=
替换
委托。合并(myEvent,value)
只需删除该块即可。您只需要订阅活动。无需
添加
删除
。只需键入
公共事件myEventHandler myEvent并且您很高兴地看到,该块在功能上与声明
事件时C#编译器本身生成的(包括线程安全性)等价(尽管它的实现稍有不同,而且很可能效率较低)。如果将此代码再次包装到其自身的块中,则此代码是有害的。您可以简单地将整个事件简化为
公共事件myEventHandler myEvent在功能或安全性方面没有损失。最有可能的是,代码是由反编译器生成的(您可以使用它进行反向工程)。最初的代码只是声明了简单事件(公共事件myEventHandler myEvent)。感谢您的回复。将尝试按照@M.kazem Akhgary的建议订阅活动,但很高兴知道如果需要,我可以使用+=&-=。
public event myEventHandler myEvent;