让我说我有:
public void Print() { ... }
public void F(object o) { ... }
现在我可以这样做:
Action a = t.Print;
F(a);
但不是:
F(Print);
为什么呢?为什么我可以传递Action
作为object
,而不是方法?并非所有代表都决心使用方法吗?不应该是一回事吗?
感谢。
答案 0 :(得分:4)
当castion为object
时,没有隐式转换为委托,因为它无法知道要创建的委托类型。例如,Print
匹配Action
和ThreadStart
- 以及大约40个与void SomeDelegateName()
签名匹配的其他委托类型(即没有参数,没有返回值)。同样,如果没有委托类型,则无法将方法组(Print
是方法组,而不是方法)解析为单个重载。
这有效:
F((Action)Print);
关键点:Action
绝对没有什么特别之处 - 它只是一个委托类型 - 它与许多其他委托类型具有相同的签名。