Список интерфейсов по сравнению со списком производного типа - не может преобразовать тип выражения для возврата типа

Хорошая вещь о Бродяге состоит в том, что Вы только платите за то распространение в прямом и обратном направлениях к SSH при открытии первого файла. Sudo тогда кэширует Ваши учетные данные, и Emacs сохраняет дескриптор, так, чтобы последующие sudo-открытые файлы заняли намного меньше времени.

я не нашел дополнительное время, которое требуется для сохранения обременения, также. Это достаточно быстро, IMO.

6
задан Martin 8 December 2009 в 01:43
поделиться

4 ответа

Потому что db.Coupons ... ToList () возвращает IList , а не IList . IList не является производным от IList , поскольку C # 3 не поддерживает универсальную дисперсию. (C # 4 поддерживает универсальную дисперсию, но в этом случае она все равно не будет производиться. Учтите, что тот, кто получит IList , может попытаться вставить в него SomeEvilTypeThatImplementsICoupon. Но IList < Coupon> не может принять это, потому что SomeEvilTypeThatImplementsICoupon не является производным от Coupon. См. http: //hestia.typepad. явно создает List , который может содержать все, что реализует ICoupon, а затем помещает некоторые объекты Coupon в этот список. Теперь, если получатель решит вставить в него SomeEvilTypeThatImplementsICoupon, все будет хорошо, потому что список был создан для хранения любого ICoupon, а не только реальных объектов Coupon.)

явно создает List , который может содержать все, что реализует ICoupon, а затем помещает некоторые объекты Coupon в этот список. Теперь, если получатель решит вставить в него SomeEvilTypeThatImplementsICoupon, все будет хорошо, потому что список был создан для хранения любого ICoupon, а не только реальных объектов Coupon.)

10
ответ дан 8 December 2019 в 17:22
поделиться

Он не может неявно преобразовать List в List . Попробуйте следующее:

public IList<ICoupon> GetCouponsForSite(string siteSlug)
{
    return _db.Coupons.Where(x => x.Site.slug == siteSlug)
                      .Select(x => new Coupon(x.id)).Cast<ICoupon>().ToList();
}

Основная причина этого заключается в том, что если бы у вас был, например, класс FancyCoupon: ICoupon , и вы попытались поместить его в List , то это не помогло бы потому что FancyCoupon не является производным от Coupon (только ICoupon), но он должен нормально работать в List . Итак, хотя на первый взгляд кажется, что он должен иметь возможность использовать один в качестве другого, между двумя типами есть довольно важные различия.

4
ответ дан 8 December 2019 в 17:22
поделиться

IQueryable не является производным от IList .

0
ответ дан 8 December 2019 в 17:22
поделиться

Это потому, что компилятор выводит ICoupon , а не Купон , в Select в качестве аргумента универсального типа. Таким образом, вместо явного приведения после Select , как предложено другими (что не слишком эффективно, потому что нужно перебирать все элементы), вы также можете использовать неявное приведение (или, вернее, дисперсию), указав правильное Выберите универсальных типов :

public IList<ICoupon> GetCouponsForSite(string siteSlug)
{
    return _db.Coupons.Where(x => x.Site.slug == siteSlug)
                  .Select<?, ICoupon>(x => new Coupon(x.id)).ToList();
}

(Вам необходимо заменить ? на соответствующий тип из коллекции Купоны .)

0
ответ дан 8 December 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: