如果行动是MDN上所述的委托:
public delegate void Action()
TestA (new Action (delegate { return; })); // Right.
TestA (delegate { return; }); // Wrong.
TestB (delegate { return; }); // Right.
TestB (() => { return; }); // Right.
public void TestA(Delegate del) {
// stuff...
}
public void TestB(Action callback) {
TestB (callback);
}
答案 0 :(得分:2)
所有代表都从Delegate
继承,因此您可以将任何委托传递给接受Delegate
的方法。
为什么不能传递匿名函数?
因为它没有委托类型。这是一个匿名方法,但编译器不知道匿名方法应该是什么委托。 (在创建匿名方法时,此处使用delegate
关键字令人困惑。您实际上并未创建匿名委托,而是创建匿名方法。)
表达式无法编译,因为编译器总是需要能够弄清楚任何表达式的类型,对于匿名方法(和lambdas),它需要从上下文中完成。当方法是Delegate
时,它无法找出哪个委托它应该是,所以它失败了。当你把它传递给Action
时,它知道它应该是什么动作,并且它是兼容的,所以,成功。
(我读到lambda创建了一个匿名委托,好像该函数是使用委托{}创建的)