无法将Task <List <TEntity >>转换为Task <IList <TEntity >>

时间:2019-06-06 12:23:09

标签: c# asynchronous async-await covariance contravariance

我正在围绕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();
}

该类是通用的,如您所见,_dbSet是上下文中具体DbSet的实例。但是,这个问题无关紧要。
对于代码,我得到以下错误:

  

[CS0029]无法隐式转换类型   'System.Threading.Tasks.Task>'   至   'System.Threading.Tasks.Task>'

如果我将返回值更改为Task<List<TEntity>>,则没有错误。
有谁知道为什么它不能转换它?谢谢!

1 个答案:

答案 0 :(得分:3)

我认为最简单的方法是等待任务。因此,它将以最小的更改工作:

public async Task<IList<TEntity>> GetAsync(Func<IQueryable<TEntity>, IQueryable<TEntity>> 
getFunction)
{
    if (getFunction == null)
    {
        return new List<TEntity>();
    }
    return await getFunction(_dbSet).AsNoTracking().ToListAsync();
}