首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C#中是否有不是MulticastDelegate的代理?

在C#中是否有不是MulticastDelegate的代理?
EN

Stack Overflow用户
提问于 2011-01-17 16:06:39
回答 4查看 1.2K关注 0票数 10

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-17 16:13:58

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

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

代码语言:javascript
复制
.class public auto ansi sealed Foo
       extends [mscorlib]System.Delegate
{
    // Body as normal
}

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

代码语言:javascript
复制
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一次。)

票数 14
EN

Stack Overflow用户

发布于 2011-01-17 16:09:50

不,没有,因为所有的委托都必须自然地能够被Delegate.Combine。委托只是为了将非组播功能包装到基类中。

票数 2
EN

Stack Overflow用户

发布于 2011-01-17 16:19:28

System.MuticastDelegate由System.Delegate派生而来。委托层次结构中的每个级别提供一组不同的服务。System.Delegate是一个数据容器,用于存储在特定对象上调用的方法。System.MulticastDelegate带来了额外的功能,不仅可以调用单个对象上的方法,还可以调用对象集合上的方法。这将允许多个订阅者订阅一个事件。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4711118

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档