+运算符如何用于组合代理?

例如:

delegate void SomeDelegate(); SomeDelegate a = new SomeDelegate( () => Console.WriteLine("A") ); SomeDelegate b = new SomeDelegate( () => Console.WriteLine("B") ); SomeDelegate c = a + b; 

在最后一行, a + b转化为什么? 我很好奇如何在不使用+运算符的情况下添加它们。

http://msdn.microsoft.com/en-us/library/ms173172(v=VS.80).aspx – 搜索补充:

委托可以在调用时调用多个方法。 这被称为多播。 要向委托的方法列表添加额外的方法 – 调用列表 – 只需要使用加法或加法赋值运算符(’+’或’+ =’)添加两个委托。 例如:

 MethodClass obj = new MethodClass(); Del d1 = obj.Method1; Del d2 = obj.Method2; Del d3 = DelegateMethod; //Both types of assignment are valid. Del allMethodsDelegate = d1 + d2; allMethodsDelegate += d3; 

此时allMethodsDelegate在其调用列表中包含三个方法 – Method1,Method2和DelegateMethod。 最初的三位代表d1,d2和d3保持不变。 调用allMethodsDelegate时,将按顺序调用所有三个方法。 如果委托使用引用参数,则依次将引用顺序传递给三个方法中的每一个,并且下一个方法可以看到一个方法的任何更改。 当任何方法抛出未在方法中捕获的exception时,该exception将传递给委托的调用方,并且不会调用调用列表中的后续方法。

更新

两个委托派生自System.Delegate您可以使用combine()方法将两个委托一起添加。

它是使用Delegate.Combine静态方法完成的。

 SomeDelegate c = Delegate.Combine(a, b) as SomeDelegate; 

当使用+=运算符时,它实际上是相同的。

 // This is the same... eventSource.onEvent += OnEvent; // ...as this. eventSource.onEvent = Delegate.Combine( eventSource.onEvent, Delegate.CreateDelegate(typeof(EventSource.OnEvent), this, "OnEvent") ) as EventSource.OnEvent; 

MulticastDelegate类( delegate关键字后面的类)确实有一个调用列表,但是这个列表是不可变的。 每次将委托与+=运算符组合时,都会创建一个新的MulticastDelegate实例,并结合前两个Delegate对象的调用列表。