因为当您event
使用event SomeHandler SomeEvent
语法定义 , 时,它默认为您定义add
andremove
。这里的要点是,您公开与 an 交互的唯一event
方式是通过add
and remove
(分别由 和 访问+=
)-=
。该语言不允许“全部重置”操作,这就是=
不允许的原因。
为了解决这个“设计选择”这个更潜在的问题......我想驱动力是一个多播模型的合同,订阅者可以自由添加和删除他们的订阅。event
允许任何人取消订阅所有订阅者将违反该合同,并且只允许一个订阅者不是合同。
附录:
看起来您正在寻找的是直接公开委托的能力,如果您只依赖 .NET 的多播委托语法,就可以做到这一点。它看起来很像event
语法,但允许使用 a 进行清除,=
甚至足够聪明,可以理解+=
a null
delegate
(见输出):
public delegate void F(int x);
public static void Main()
{
F f = null;
f += x => System.Console.WriteLine("First: {0}", x);
f += x => System.Console.WriteLine("Second: {0}", x);
f(5);
}
或者,您可以使用长格式event
with your add
/ remove
hit an internal list 并提供一种允许清除该列表的方法。