我写了一个示例,
当我创建一个如下所示的委托实例时
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()
{
}
}
}
答案 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;
如果你想要多播。