委托书问题

本文关键字:问题 委托书 | 更新日期: 2023-09-27 17:58:54

就像我在上一个问题中告诉你的那样,我正在学习关于代表的知识,或者更好地说,我正在努力回答我关于那些坏男孩的所有问题。

MSDN文档对我帮助不大。他们无法真正回答我以下问题:

我有这个代码:

public delegate void Del(string message);

现在,您昨天告诉我的是,编译器以某种方式从该行创建了一个Del.类型的委托

您昨天还告诉我,每个委托都继承自Delegate(带大写字母)类。

到目前为止还不错,但现在我的问题是我可以做以下Del d = DoSomething; d();,但为什么我不能做同样的Delegate?。

我不能做这样的Delegate e = d; e()。只有DynamicInvoke方法,但没有直接调用。

如果每个人都建议以某种方式远离Delegate(带大写字母),那么它有什么用?

我希望你们不要把我和其他已经存在的答案联系起来。如果可能的话,如果有人能抽出5分钟的时间在这里与我讨论这件事,我将不胜感激。感谢

委托书问题

每个委托都有一个strong签名:需要指定返回类型和参数类型。Delegate基类用于实现任何委托,但不用于直接调用。

它与Enum类相同。它是帮助处理枚举的基类。

我认为这可能是因为当您声明一个delegate Del时,编译器会创建一个类Del,该类子类Delegate是一个抽象类。所以

    Del d = DoSomething; 

实际上是的快捷方式

    Del d = new Del(DoSomething); 

你不能对Delegate做同样的事情,因为它是一个抽象类,所以

    Delegate e = new Delegate(d); 

是非法的。

注意,根据您的代码片段

Del d = DoSomething; 
d();

将无法编译,并出现无效的签名错误,因为调用与签名不匹配(您需要类似d("Hello world")的东西才能使其工作。此外,使用返回值d将产生编译时错误(例如var result = d("");),因为编译器知道Del委托具有无效返回。

当通过Delegate实例使用相同的东西时,关于该值的所有信息都是可调用的,并且返回类型和参数(数量或类型)是未知的。系统使您能够通过DynamicInvoke间接调用委托,这里是动态的,这意味着任何解决方案和任何错误都要到执行时才能知道。