c# - 使用 Task.FromResult 将 Task<T> 隐式转换为 Task<X> 其中 T : X?

标签 c# inheritance task

Task<IDictionary<double, double>> GetTaskDict()
{
     return Task.FromResult(new Dictionary<double, double> () );
}

此代码无法编译,因为我们无法在 Task> 到 Task> 之间进行转换。为什么这不起作用,是否可以使这种类型的调用起作用?这与这样的编译方法相反

IDictionary<double, double> GetTaskDict()
{
     return new Dictionary<double, double> ();
}

最佳答案

return Task.FromResult<IDictionary<double, double>>(new Dictionary<double, double>());

这是因为 Task<T>不是协变的,所以 Task<Foo>不能与 Task<IFoo> 互换即使Foo : IFoo .

您不妨考虑使用ValueTask<T>如果您要获得大量同步可用的结果-在这种情况下要便宜得多。你甚至可以使用隐含的 new()在那种情况下的用法:

ValueTask<IDictionary<double, double>> GetTaskDict()
{
    return new(new Dictionary<double, double>());
}

(这里,new(...) 从方法声明的返回类型解释为 new ValueTask<IDictionary<double, double>>(...))

关于c# - 使用 Task.FromResult 将 Task<T> 隐式转换为 Task<X> 其中 T : X?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67061611/

相关文章:

c# - 使用 iTextSharp 库提取 pdf 文件中包含的签名图像

wpf - 为什么 WPF 中没有视觉继承?

c# - 我可以实现 DisposeBase 抽象类吗?

php - 通过在 Netbeans 7.1 中按目录过滤来限制任务列表

c# - C# 中的回调

c# - Azure 服务总线读取性能

c# - 如何使用 C# 创建 JSON post 到 api

postgresql - 在同一事件上触发之前和之后?填充子表 PostgreSQL

c# - 使用 Task.WhenAll 执行多个任务时 foo.Start() 出现错误

bash - 如果任务失败发送电子邮件