为什么我不能将方法作为对象传递?

时间:2014-04-16 15:05:22

标签: c# object delegates

让我说我有:

public void Print() { ... }
public void F(object o) { ... }

现在我可以这样做:

Action a = t.Print;
F(a);

但不是:

F(Print);

为什么呢?为什么我可以传递Action作为object,而不是方法?并非所有代表都决心使用方法吗?不应该是一回事吗?

感谢。

1 个答案:

答案 0 :(得分:4)

当castion为object时,没有隐式转换为委托,因为它无法知道要创建的委托类型。例如,Print匹配ActionThreadStart - 以及大约40个与void SomeDelegateName()签名匹配的其他委托类型(即没有参数,没有返回值)。同样,如果没有委托类型,则无法将方法组Print是方法组,而不是方法)解析为单个重载。

这有效:

F((Action)Print);

关键点:Action绝对没有什么特别之处 - 它只是一个委托类型 - 它与许多其他委托类型具有相同的签名。