我有一个返回Task<String>的函数,要构造此Task,我必须使用匿名async函数,因为我必须在await中进行多次调用Task。我发现可以返回"",但是如果尝试返回null则会出现错误(Visual Studio消息)

显示相同问题的函数

public virtual Task<String> FooBar()
{
    return Task<String>.Run(async () =>
    {
        await Task.Delay(1500);
        return ""; // OK
        //return null; // Error
    });
}
这是怎么回事?
如果我想返回空值,是否更适合return await Task.FromResult<String>(null);

最佳答案

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

return (string)null;

另外,正如注释中提到的那样,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
    });
}

关于c# - 返回运行异步匿名函数的Task中的类型?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38835772/

10-16 08:53