我认为答案是否定的?如果没有,为什么我们将Delegate
和MulticastDelegate
类分开?也许是因为“其他一些.NET语言”?
答案 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
,但这绝不需要。