Какая разница сущестует между IEnumerable<TEntity> и Task<IEnumerable<TEntity>>?

165
12 июля 2017, 22:29

Так все ОК

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<>?

Answer 1

В первом примере ковариантности и нет вовсе - у вас тип обобщённого параметра остаётся прежним, TEntity, а меняется тип самого контейнера. Так как класс List<TEntity>реализует интерфейс IEnumerable<TEntity>, ошибок нет. А во втором случае как раз проявляется та самая неработающая ковариантность, о которой говорилось в упомянутом вами ответе.

READ ALSO
Отображение числа 9223372036854775807

Отображение числа 9223372036854775807

Почему разные языки по-разному отображают число 9223372036854775807, хотя все используют один и тот же формат 8-байтного double для представления чисел?

380
Почему-то не появляется модальное окно

Почему-то не появляется модальное окно

Эксперементировал вот по этому гайду с небольшими изменениями, но почему-то в итоге открывается новая страница, а не модальное окно

297
Проблема с MySQL C#

Проблема с MySQL C#

Почему появляется исключение при изменении пароля, но пароль в базе данных меняется

233
Определение dns адресов у proxy c#

Определение dns адресов у proxy c#

Можно ли получить список dns proxy не используя при этом браузер ? Желательно средствами c#?

284