由于C#的Task是一个类,你显然无法将其转换Task<TDerived>为a Task<TBase>.
但是,你可以这样做:
public async Task<TBase> Run() {
return await MethodThatReturnsDerivedTask();
}
Run Code Online (Sandbox Code Playgroud)
是否有一个静态任务方法我可以调用来获取一个Task<TDerived>基本上只指向底层任务并转换结果的实例?我喜欢这样的东西:
public Task<TBase> Run() {
return Task.FromDerived(MethodThatReturnsDerivedTask());
}
Run Code Online (Sandbox Code Playgroud)
这种方法存在吗?是否仅为此目的使用异步方法有任何开销?
我正在围绕 EF Core 编写一个小包装方法DbSet。我有以下方法:
public Task<IList<TEntity>> GetAsync(Func<IQueryable<TEntity>, IQueryable<TEntity>> getFunction)
{
if (getFunction == null)
{
Task.FromResult(new List<TEntity>());
}
return getFunction(_dbSet).AsNoTracking().ToListAsync();
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,该类是通用的,并且 _dbSet 是DbSet上下文中具体的实例。然而,对于这个问题来说,这并不重要。
对于代码我得到以下错误:
[CS0029] 无法将类型“System.Threading.Tasks.Task>”隐式转换为“System.Threading.Tasks.Task>”
如果我将返回值更改为Task<List<TEntity>>则不会出现错误。
有谁知道为什么它不能转换它?谢谢!
正如标题所述,我很好奇是否可以从 转换Task<List<Derived>>为Task<List<BaseType>>?
我有几个返回 的方法Task<List<Derived>>,并且可以有多种类型的派生类。我想将所有任务存储在任务列表中:List<Task<List<BaseType>>>稍后执行。
如果我的任务不是包装列表,这将非常简单:链接
编辑1
这是我遇到问题的部分,我在将任务存储在列表中时遇到问题:
// This throws an error (cannot convert derived list to base list)
var tasks = new List<Task<List<BaseType>>>
{
asyncThing1(), // returns Task<List<Derived1>>
asyncThing2(), // returns Task<List<Derived2>>
// ... n number more
};
// Need the list of tasks before I can execute
List<BaseType>[] results = await Task.WhenAll(tasks);
Run Code Online (Sandbox Code Playgroud)
编辑2
以上,List<Base>[]改为List<BaseType>[]