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

时间:2016-08-08 18:06:02

标签: c#

我有一个返回Task<String>的函数来构造这个Task我必须使用匿名async函数,因为我必须await Task多次调用"" 1}}。我发现我可以返回public virtual Task<String> FooBar() { return Task<String>.Run(async () => { await Task.Delay(1500); return ""; // OK //return null; // Error }); } 但是如果我尝试返回null则会出现错误(Visual Studio消息)

  

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

     

异步lambda表达式转换为&#39;任务&#39;返回委托不能返回值。您打算返回&#39;任务&#39;

显示相同问题的功能

return await Task.FromResult<String>(null);

这里发生了什么?

如果我想返回空值,div { background: #fe89d7; width: 1px; height: 15px; display: inline-block; } p { display: inline-block; padding: 15px; }会更合适吗?

1 个答案:

答案 0 :(得分:2)

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

return (string)null;

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

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