Action a1 = () => Console.Write(1);
Action a2 = () => Console.Write(2);
Action a3 = () => Console.Write(3);
((a1 + a2 + a3) - (a1 + a2))();
((a1 + a2 + a3) - (a1 + a3))();
我看到了这个例子,变得很有趣。在这种情况下,完成了委托的移除。在 (a1 + a2) 和 (a1 + a3) 处发生了什么,为什么第一个选项可以正确删除而第二个选项根本不起作用?
让它
a1 + a2 + a3变成一个委托,我们将有条件地表示为[a1, a2, a3],a1 + a2--[a1, a2],a1 + a3--[a1, a3]。在做减法的时候,找一行
[a1, a2, a3]中的一块,等于被减的那块。对于这样的一块,从索引 0 开始,但是对于- 没有。所以减法的时候结果是,但是减法的时候没有找到合适的棋子,就没有减法。[a1, a2][a1, a3][a1, a2, a3] - [a1, a2][a3][a1, a2, a3] - [a1, a3]这条规则的意思是,如果已经通过将一个列表添加到其他列表来获得委托,那么这个第一个列表将作为子列表在总委托中找到。所以在这种情况下减法是有意义的。
引用标准第 7.8.5 段: