Он не может неявно привести Список в Список . Попробуйте это:
public IList<ICoupon> GetCouponsForSite(string siteSlug)
{
return _db.Coupons.Where(x => x.Site.slug == siteSlug)
.Select(x => new Coupon(x.id)).Cast<ICoupon>().ToList();
}
Основная причина этого состоит в том, что если у вас есть, например, class FancyCoupon : ICoupon
и вы пытаетесь поместить его в List<Coupon>
, то это не получится, потому что FancyCoupon не наследуется от Coupon (только ICoupon), но он должен работать только штраф в List<ICoupon>
. Таким образом, хотя на первый взгляд кажется, что он должен быть в состоянии использовать один, а другой, между этими двумя типами есть довольно важные различия.
Вызов приведения по существу перебирает список и настраивает каждый из них для нового списка (из соображений производительности под капотом есть кое-что еще, но для практических целей вы можете думать об этом так).
(Обновлено с исправлением из комментариев)