我认为答案是否定的?如果没有,我们为什么要Delegate
分班MulticastDelegate
?也许又是因为“其他一些 .NET 语言”?
4 回答
编辑:我认为这是 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 一次。)
不,没有,因为所有代表都必须自然能够被Delegate.Combine
编辑。委托只是将非多播功能包装到基类中。
System.MuticastDelegate 派生自 System.Delegate。委托层次结构中的每个级别都提供一组不同的服务。System.Delegate 是在特定对象上调用什么方法的数据容器。System.MulticastDelegate 带来了额外的功能,不仅可以在单个对象上调用方法,还可以在对象集合上调用方法。这使多个订阅者能够参与到一个事件中。
不确定,我已经回答了你的问题。
不,CLR 不允许这样做。
我记得他们想Delegate
直接公开的东西,但从来不需要。