使用Delegate参数将匿名函数与Func / Action发送到另一个函数之间的区别?

时间:2016-11-23 20:43:04

标签: c# delegates

如果行动是MDN上所述的委托

  

public delegate void Action()

  • 为什么可以将其作为委托传递给非委托类型?
  • 为什么不能通过匿名函数呢? (我读到lambda创建了一个匿名委托,好像该函数是用 delegate {} 创建的)
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);
}

1 个答案:

答案 0 :(得分:2)

所有代表都从Delegate继承,因此您可以将任何委托传递给接受Delegate的方法。

  

为什么不能传递匿名函数?

因为它没有委托类型。这是一个匿名方法,但编译器不知道匿名方法应该是什么委托。 (在创建匿名方法时,此处使用delegate关键字令人困惑。您实际上并未创建匿名委托,而是创建匿名方法。)

表达式无法编译,因为编译器总是需要能够弄清楚任何表达式的类型,对于匿名方法(和lambdas),它需要从上下文中完成。当方法是Delegate时,它无法找出哪个委托它应该是,所以它失败了。当你把它传递给Action时,它知道它应该是什么动作,并且它是兼容的,所以,成功。

  

(我读到lambda创建了一个匿名委托,好像该函数是使用委托{}创建的)

  1. 这是一个匿名方法,但不是lambda。
  2. 匿名方法或lambda永远不会在C#中创建匿名委托。它在VB.NET中有用(也许你听过并认为它适用于C#?),但在C#中没有匿名委托这样的东西。