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

时间:2011-01-17 08:06:39

标签: c# .net delegates multicastdelegate

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

4 个答案:

答案 0 :(得分:13)

编辑:我这是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在尝试加载时会这样做:

  

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

基本上,Delegate / MulticastDelegate分离是一次历史性事故。我相信早期的alpha / beta版本确实做出了区分,但事实证明它太混乱了并且通常没用 - 所以现在每个委托来自MulticastDelegate。

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

不,CLR不允许这样做。

我记得他们想要直接公开Delegate,但这绝不需要。