委托的调用问题

3

像我在之前的问题中告诉你的那样,我正在学习委托,或者更准确地说,我正在尝试回答我所拥有的所有关于这些东西的问题。

MSDN文档并没有真正对我有所帮助。他们无法真正回答我以下问题:

我有这段代码:

public delegate void Del(string message);

昨天你告诉我编译器通过该行代码创建了一个类型为 Del 的委托。
你还告诉我,每个委托都继承自 Delegate 类(大写字母)。
到目前为止一切正常,但现在我的问题是:我可以这样做 Del d = DoSomething; d(); 但是为什么不能用 Delegate 呢?
我无法像这样做 Delegate e = d; e()。只有 DynamicInvoke 方法,而没有直接的调用方式。
如果所有人都建议远离 Delegate(大写字母),那么 Delegate(大写字母)有什么用处呢?
如果可能的话,我希望大家不要链接到其他已经存在的答案。谢谢。
3个回答

1
每个委托都有一个强大的签名:需要指定返回类型和参数类型。基础的Delegate类用于实例化任何委托,但不是为了直接调用。
这与Enum类相同。它是一个基类,用于处理枚举。

好的,我没有像你那样看到所有的内容。谢谢。但是枚举类型没有DynamicInvoke方法,对吗?我不明白的是为什么我需要那个DynamicInvoke?我将一个Action分配给Delegate,突然之间我需要使用反射来运行该方法的DynamicInvoke。为什么当我已经知道方法/委托,因为我在第一次将Action分配给Delegate时。 - dev hedgehog
@devhedgehog,我不太确定你的问题是什么,但可能是因为在编译时需要匹配签名,而不仅仅是在运行时。 - Ben Aaronson

0

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

    Del d = DoSomething; 

实际上是的缩写

    Del d = new Del(DoSomething); 

你不能像使用其他类一样使用Delegate,因为它是一个抽象类。

    Delegate e = new Delegate(d); 

是非法的。


嗨 Ned,我在谈论调用。你似乎在谈论初始化。不过说得好。是的,Delegate类是一个抽象类。 - dev hedgehog

0
请注意,根据您的代码片段。
Del d = DoSomething; 
d();

如果调用不符合签名(你需要像 d("Hello world") 这样的东西才能使其工作),则会编译失败并出现无效签名错误。同时,使用 d 的返回值将导致编译时错误(例如 var result = d("");),因为编译器知道 Del 委托具有 void 返回。

当通过 Delegate 实例使用相同的东西时,关于该值所知道的仅是它是可调用的,而返回类型和参数(按数量或类型)是未知的。系统允许您间接调用委托,通过 DynamicInvoke,这里的动态意味着任何解析和任何错误直到执行时才会知道。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接