Так все ОК
public virtual IEnumerable<TEntity> Get()
{
return Context.Set<TEntity>().ToList();
}
Но стоит попытаться сделать так
public virtual Task<IEnumerable<TEntity>> Get()
{
return Context.Set<TEntity>().ToListAsync();
}
и вы получите ошибку неявного приведения 'System.Threading.Tasks.Task<System.Collections.Generic.List<TEntity>>' to 'System.Threading.Tasks.Task<System.Collections.Generic.IEnumerable<TEntity>>'
Задать данный вопрос во многом сподвиг меня вот этот ответ на похожий вопрос.
На мой скромный взгляд, данный ответ не объясняет ничего. Да, ковариантность в случае обобщений не работает, хотя постойте, в первом же примере все ОК, или нет? Или ковариантность перестает работать только в случае Task<>?
В первом примере ковариантности и нет вовсе - у вас тип обобщённого параметра остаётся прежним, TEntity, а меняется тип самого контейнера. Так как класс List<TEntity>реализует интерфейс IEnumerable<TEntity>, ошибок нет. А во втором случае как раз проявляется та самая неработающая ковариантность, о которой говорилось в упомянутом вами ответе.
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости