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

标签 c# asp.net

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

        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/

相关文章:

c# - 正则表达式允许数字、破折号、逗号

c# - 在不读取整个文件的情况下获取图像尺寸

c# - 将密码加密并存储在 web.config 文件中

asp.net - 使用站点地图进行两级水平导航

jquery - 访问不同 TD 中控件的 ClientID

c# - 在 C# (VTSO) 中将 Excel FitToPagesWide 设置为 "Automatic"

C# 从一个图片框拖放到另一个图片框

c# - 这个 MSDN CompareExchange 示例如何不需要 volatile 读取?

c# - VS.NET 'current breakpoint will not be hit' 警告的原因?

asp.net - Response.Redirect异常