是否有一个委托,它不是C#中的MulticastDelegate?

我觉得答案是否定的? 如果没有,为什么我们将DelegateMulticastDelegate类分开? 也许是因为“其他一些.NET语言”?

编辑:我认为这是ECMA 335的一部分,但我无法在任何地方看到它。

你不能在C#中创建这样的委托类型,但你可以在IL中:

 .class public auto ansi sealed Foo extends [mscorlib]System.Delegate { // Body as normal } 

使用这样的委托时,C#编译器没有问题:

 using System; class Test { static void Main() { Foo f = x => Console.WriteLine(x); f("hello"); } } 

但CLR在尝试加载时会这样做:

未处理的exception:System.TypeLoadException:无法从程序集’Foo,Version = 0.0.0.0,Culture = neutral,PublicKeyToken = null’加载类型’Foo’,因为它无法直接从委托类inheritance。 在Test.Main()

基本上,Delegate / MulticastDelegate分离是一次历史性事故。 我相信早期的alpha / beta版本确实做出了区分,但事实certificate它太混乱了,而且通常没用 – 所以现在每个代理都派生自MulticastDelegate。

(有趣的是,C#规范仅在不能用作通用约束的类型列表中提到MulticastDelegate一次。)

不,没有,因为所有代表必须自然能够成为Delegate.Combine ed。 Delegate只是将非多播function包装到基类中。

System.MuticastDelegate派生自System.Delegate。 委托层次结构中的每个级别都提供不同的服务集。 System.Delegate是要在特定对象上调用哪种方法的数据的容器。 使用System.MulticastDelegate,不仅可以在单个对象上调用方法,还可以在对象集合上调用方法。 这使得多个订阅者能够参加活动。

不确定,我已经回答了你的问题。

不,CLR不允许这样做。

我记得他们希望直接公开Delegate ,但这从来不需要。