委托添加和删除

时间:2012-01-04 13:11:18

标签: c# delegates

我写了一个示例,

当我创建一个如下所示的委托实例时

AddFunctions d1 += new AddFunctions(Function1); 

我收到了编译错误,因此+ =被移除并以这种方式创建

AddFunctions d1 = new AddFunctions(Function1);

我只是很想知道为什么在创建单个委托实例时不允许多播(+ =)?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Delegates
{
    public delegate void AddFunctions();

    class Program
    {

        static void Main(string[] args)
        {
            AddFunctions d1 = new AddFunctions(Function1);
            d1 -= d1;
            d1();
        }

        static void Function1()
        {
        }

        static void Function2()
        {
        }
    }
}

4 个答案:

答案 0 :(得分:5)

这与您不被允许的原因完全相同:

int i += 1;

代表的+=运算符是一个组合。允许事件(它映射到add访问者)和字段/变量(只要分配了变量)(它映射到Delegate.Combine

真的想要使用+=,请尝试:

AddFunctions d1 = null;
d1 += Function1;

但是,以下内容更容易:

AddFunctions d1 = Function1;

答案 1 :(得分:3)

以下工作正常,= null初始化是必需的。这也解释了为什么+=不能用于decalaration。

 AddFunctions d1 = null;
 d1 += new AddFunctions(Function1);

它与代理人没有什么关系,你得到

的相同错误
 int i += 1;

答案 2 :(得分:2)

+=运算符将现有委托与另一个委托合并; d1 += d2相当于d1 = d1 + d2。但在您的情况下,d1尚未初始化,因此将其与另一个委托相结合是没有意义的。您需要先使用=初始化它。

答案 3 :(得分:1)

尝试:

AddFunctions d1 = null;
d1 += Function1;

如果你想要多播。