【问题标题】:Async lambda expression converted to a 'Task' returning delegate cannot return a value转换为“任务”返回委托的异步 lambda 表达式无法返回值
【发布时间】:2018-02-17 21:48:57
【问题描述】:

我在 ASP.NET Core 应用程序中有以下内容(Startup.csConfigure 方法):

我刚刚添加了async 关键字,因为我需要await 一个... 所以现在,我得到以下信息:

错误 CS8031 异步 lambda 表达式转换为“Task”返回 委托不能返回值。你打算返回'Task<T>'吗?

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, ITableRepositories repository)
{
    // ...  
    app.UseStaticFiles();    
    app.UseCookieAuthentication();

    app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
    {
        ClientId = Configuration["..."],
        Authority = Configuration["..."],
        CallbackPath = Configuration["..."],
        Events = new OpenIdConnectEvents
        {
            OnAuthenticationFailed = context => { return Task.FromResult(0); },
            OnRemoteSignOut = context => { return Task.FromResult(0); },
            OnTicketReceived = async context =>
            {
                var user = (ClaimsIdentity)context.Ticket.Principal.Identity;
                if (user.IsAuthenticated)
                {
                    var firstName = user.FindFirst(ClaimTypes.GivenName).Value;
                    // ...
                    List<Connection> myList = new List<Connection>() { c };
                    var results = await repository.InsertOrMergeAsync(myList);
                    var myConnection = (results.First().Result as Connection);                         
                }
                return Task.FromResult(0); // <<< ERROR HERE ....... !!!
            },
            OnTokenValidated = context => { return Task.FromResult(0); },
            OnUserInformationReceived = context => { return Task.FromResult(0); },
        }
    });

    app.UseMvc(routes =>        { ...        });
}

在这种情况下我应该返回什么?我尝试return 0;,但错误信息没有改变...

附言。 OnTicketRecieved签名

namespace Microsoft.AspNetCore.Authentication
{
    public class RemoteAuthenticationEvents : IRemoteAuthenticationEvents
    {
        public Func<TicketReceivedContext, Task> OnTicketReceived { get; set; }

【问题讨论】:

  • 请不要删除您的问题,因为它已关闭并重新创建一个新的相同问题以摆脱接近投票和 cmets。 – 另外,我正要回答您的原始问题,但您删除了它……
  • OnTicketReceived 期待什么委托类型?
  • @MikeStrobel 我更新了 OP 来解释它
  • 听起来OnTicketReceived 想要一个返回Task 的委托,即没有结果的任务。我猜当您添加async 时,您的lambda 的隐式返回类型变为async Task。这意味着您无法返回值,因此请将您的 lambda 视为返回 void。只需完全删除您的退货声明即可。

标签: c# asp.net-core async-await


【解决方案1】:

错误信息实际上是不言自明的:

转换为 'Task' 返回委托的异步 lambda 表达式无法返回值。你打算回'Task&lt;T&gt;'吗?

所以你有一个异步 lambda 表达式,它应该返回一个 Task,而不是任何 TTask&lt;T&gt;

但是当您执行return 0 时,您将返回一个int,因此您的异步方法的返回类型是Task&lt;int&gt;,而不是Task。编译器希望你做的是返回根本没有值

OnTicketReceived = async context =>
{
    await Task.Delay(100);
    return;
}

【讨论】:

  • 由于 SO 编辑器将 Task&lt;T&gt; 文本转换为 Task,所以我的引用是错误的。固定的。如果不需要,请不要投我的票并索要代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 2016-04-15
  • 1970-01-01
相关资源
最近更新 更多