委托书问题
本文关键字:问题 委托书 | 更新日期: 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
间接调用委托,这里是动态的,这意味着任何解决方案和任何错误都要到执行时才能知道。