【问题标题】:Difference between sending an anonymous function vs. Func/Action to another function with a Delegate parameter?使用 Delegate 参数将匿名函数与 Func/Action 发送到另一个函数之间的区别?
【发布时间】:2016-11-23 20:43:03
【问题描述】:

如果 Action 是 MDN 上所述的 委托

公共委托 void Action()

  • 为什么可以作为Delegate传递给非委托类型?
  • 那为什么不能传递匿名函数呢? (我读到 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);
}

【问题讨论】:

    标签: c# delegates


    【解决方案1】:

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

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 2013-03-29
      • 2022-11-10
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2019-09-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多