使用Task.FromResult将Task<T>隐式转换为Task<X>,其中T:X?
c#
Task<IDictionary<double, double>> GetTaskDict()
{
return Task.FromResult(new Dictionary<double, double> () );
}
这段代码无法编译,因为我们无法在 Task<Dictionary<double, double>> 到 Task<IDictionary<double, double>> 之间进行转换。为什么这不起作用,是否可以使这种类型的呼叫起作用?这与这样的编译方法相反
IDictionary<double, double> GetTaskDict()
{
return new Dictionary<double, double> ();
}
回答
return Task.FromResult<IDictionary<double, double>>(new Dictionary<double, double>());
这是因为Task<T>不是协变的,所以 aTask<Foo>不能与 a 互换,Task<IFoo>即使Foo : IFoo。
ValueTask<T>如果您要获得大量同步可用的结果,您可能还希望考虑使用- 在这种情况下它要便宜得多。您甚至可以new()在该场景中使用隐式用法:
ValueTask<IDictionary<double, double>> GetTaskDict()
{
return new(new Dictionary<double, double>());
}
(这里,new(...)被解释为new ValueTask<IDictionary<double, double>>(...)从方法的声明返回类型)
THE END
二维码