10

我认为答案是否定的?如果没有,我们为什么要Delegate分班MulticastDelegate?也许又是因为“其他一些 .NET 语言”?

4

4 回答 4

14

编辑:我认为这是 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 一次。)

于 2011-01-17T08:13:58.433 回答
2

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

于 2011-01-17T08:09:50.447 回答
2

System.MuticastDelegate 派生自 System.Delegate。委托层次结构中的每个级别都提供一组不同的服务。System.Delegate 是在特定对象上调用什么方法的数据容器。System.MulticastDelegate 带来了额外的功能,不仅可以在单个对象上调用方法,还可以在对象集合上调用方法。这使多个订阅者能够参与到一个事件中。

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

于 2011-01-17T08:19:27.790 回答
1

不,CLR 不允许这样做。

我记得他们想Delegate直接公开的东西,但从来不需要。

于 2011-01-17T08:09:46.703 回答