在运行异步匿名函数的任务中返回类型?

KDe*_*ker 5 c#

我有一个返回 a 的函数Task<String>,要构造它,Task我必须使用匿名async函数,因为我必须awaitTask. 我发现我可以返回,""但如果我尝试返回 null 会出现错误(Visual Studio 消息)

匿名函数转换为 void 返回委托不能返回值

转换为“任务”返回委托的异步 lambda 表达式无法返回值。您是否打算返回“任务”?

显示相同问题的函数

public virtual Task<String> FooBar()
{
    return Task<String>.Run(async () =>
    {
        await Task.Delay(1500);
        return ""; // OK
        //return null; // Error 
    });
}
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?

return await Task.FromResult<String>(null);如果我想返回空值是否更合适?

Sco*_*ain 5

编译器不知道null字符串是否为空,因此无法自动选择正确的类型Func<Task<string>>。请执行以下操作来告诉编译器 null 是针对字符串的。

return (string)null;
Run Code Online (Sandbox Code Playgroud)

另外,正如评论中提到的,Task.Run<TResult>(Func<Task<TResult>> function)它是一个静态方法,因此当您这样做时,Task<String>.Run(...您仍然调用相同的静态方法Task.Run,没有额外的信息。相反,您需要做的是调用它并将类型传递到Run强制返回类型的部分,string而不是让编译器尝试找出返回类型应该是什么。

public virtual Task<String> FooBar()
{
    return Task.Run<String>(async () =>
    {
        await Task.Delay(1500);
        return null; // Does not error 
    });
}
Run Code Online (Sandbox Code Playgroud)