Я пишу небольшой метод-обертку вокруг 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] Cannot implicitly convert type 'System.Threading.Tasks.Task>' to 'System.Threading.Tasks.Task>'
Если я изменю возвращаемое значение на Task<List<TEntity>>
, ошибки не будет.
Кто-нибудь знает, почему он не может преобразовать его? Спасибо!
@Sinatr Вы могли бы предложить редактирование, и я был бы рад принять его :) В любом случае спасибо
Task
не является интерфейсом и, следовательно, не поддерживает ковариацию. Task<List<...>>
может дать только List<...>
, а не любой класс, реализующий IList<...>
. Возможно, было бы полезно сделать это, но это не считается достаточно полезным для фактической реализации.
Самый простой способ, на мой взгляд, это дождаться задания. Таким образом, он будет работать с минимальными изменениями:
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();
}
Возможный дубликат Ошибка преобразования типа при асинхронном программировании