c# - 可以将委托(delegate)分配给匿名方法或 lambda,但不能分配给方法

标签 c# asynchronous async-await

在下面的代码片段中,

class Program
{
    static async Task Work()
    {
        await Task.Delay(1000);
    }

    static async Task Main()
    {
        // Action a =  Work;
        Action b = async () => await Task.Delay(1000);
        Action c =  async delegate () { await Task.Delay(1000);  };
    }
}

代表类型 Action不能分配给方法 Work类型 Task但奇怪的是可以分配给匿名方法或类型为 Task 的 lambda .

我的理解

  • Work
  • async () => await Task.Delay(1000)
  • async delegate () { await Task.Delay(1000); }

具有与Action 不兼容的相同签名.是什么导致了这种不一致?

编辑:

下面的lambda和匿名方法

  • async () => await Task.Delay(1000)
  • async delegate () { await Task.Delay(1000); }

可以同时代表ActionFunc<Task>取决于分配的左侧。更准确地说,

转换为 Action含蓄地,

  • Action a = async () => await Task.Delay(1000)
  • Action b = async delegate () { await Task.Delay(1000); }

转换为 Func<Task>含蓄地,

  • Func<Task> a = async () => await Task.Delay(1000)
  • Func<Task> b = async delegate () { await Task.Delay(1000); }

下面@JSteward 的评论是关于吗?

最佳答案

首先,Action是一个返回类型void的委托(delegate):

public delegate void Action()

并且您的方法具有返回类型 Task

其次,由 lambda 表达式创建的匿名方法的返回类型由委托(delegate)(Action)的类型决定。由于委托(delegate)是 void,您正在创建一个 void 匿名方法。 Task.Delay 调用的返回值被丢弃。

此外,delegate() 表达式中的匿名函数不是您假设的Task 类型。它是 void 类型,因为它没有 return 语句。如果你添加一个它甚至不会编译,因为你试图将它分配给 void 类型的委托(delegate):

Action c =  async delegate () { return await Task.Delay(1000);  };

给出错误信息

Anonymous function converted to a void returning delegate cannot return a value.

关于c# - 可以将委托(delegate)分配给匿名方法或 lambda,但不能分配给方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47462133/

相关文章:

c# - 在事件处理程序上使用 lambda exp 时如何等待多个任务

multithreading - await Task.WhenAll() 与 Task.WhenAll().Wait()

c# - 参数返回 404 的 WebAPI 路由属性

c# - getter setter 文本字段 JAVA GUI

c# - 异步套接字的内存问题并开始发送

javascript - 同步和异步编程有什么区别(在node.js中)

javascript - Koa2 request.body 为空

c# - 串联列表中的项目以在 WPF 组合框 Itemssource 中使用

c# - 如何解决 VS 2010 ASP.Net ReportViewer HttpHandler 注册错误?

javascript - 如何在if block 中处理异步函数