У меня есть (netcoreapp3) API-приложение, которое связывается со второй (netstandard2.0) библиотекой классов для обслуживания асинхронных c запросов к базе данных. В этом примере Product
реализует интерфейс IProduct
.
При реализации поиска в базе данных требуется "получить" конкретный Product
, но вернуть его IProduct
, но компонент Task<T>
вызывая ошибки компиляции:
public Task<IProduct> GetSingleAsync(int id)
{
var query = "SELECT P.ID, P.Name FROM [Product] P WHERE P.ID = @ID";
return QueryFirstOrDefaultAsync<Product>(query, new { ID = id });
}
В частности, оператор возврата показывает:
Ошибка CS0029 Не удается неявно преобразовать тип 'System.Threading.Tasks.Task ' в 'System .Threading.Tasks.Task '
Я не знаю, должен ли я выполнять какое-либо "ковариантное" приведение во время выполнения?
И как это будет работать для GetAllAsync()
метода, который может захотеть вернуть Task<IList<IProduct>>
? Требуется ли создание второго массива и «приведение» каждого элемента?
В синхронной версии возврат Product
как IProduct
просто работает. Примечание: QueryFirstOrDefaultAsync<T>
- это метод расширения, который создаст заполненный объект Product
(в приведенном выше случае).
Спасибо.