就像我在上一个问题中告诉你的那样,我正在了解代表或者更好地说我正在尝试回答我对那些坏男孩的所有问题。
MSDN Docs不知何故对我帮助不大。他们无法回答我的问题:
我有这段代码:
public delegate void Del(string message);
现在你告诉我的是,不知怎的,编译器会从Del那个类的那一行创建一个委托。
你昨天也告诉我,每个代表都继承自Delegate
(带上限字母)类。
到目前为止一直很好,但现在我的问题是我可以关注Del d = DoSomething; d();
,但为什么我不能对Delegate
做同样的事情?
我不能做这样的事情Delegate e = d; e()
。只有DynamicInvoke方法,但没有直接调用。
如果每个人都建议以某种方式远离它,那么Delegate
(带有上限字母)是什么好的呢?
我希望你们不要把我与其他已经存在的答案联系起来。如果可能的话,如果有人花5分钟的时间和我讨论这个问题,我将不胜感激。感谢
答案 0 :(得分:1)
每个代理都有一个强大的签名:需要指定返回类型和参数类型。基础Delegate
类在这里实现任何委托,但不是为了直接调用目的。
它与Enum
类相同。它是帮助处理枚举的基类。
答案 1 :(得分:0)
我认为这可能是因为当您声明delegate
Del
时,编译器会创建一个类Del
,即子类Delegate
,它是一个抽象类。所以
Del d = DoSomething;
实际上是
的快捷方式 Del d = new Del(DoSomething);
你不能对Delegate
做同样的事情,因为它是一个抽象类,所以
Delegate e = new Delegate(d);
是非法的。
答案 2 :(得分:0)
请注意,根据您的代码,代码段
Del d = DoSomething;
d();
由于调用与签名不匹配,将无法编译,签名错误无效(您需要d("Hello world")
之类的内容才能使其正常工作。同时使用返回值d
将产生编译时错误(例如var result = d("");
),因为编译器知道Del
个委托有一个void返回。
当通过Delegate
实例使用相同的东西时,所有可以知道的值是可调用的,并且返回类型和参数(数量或类型)是未知的。系统允许您通过DynamicInvoke
间接调用委托,这里的动态意味着在执行时间之前不会知道任何解决方案和任何错误。