Хорошая вещь о Бродяге состоит в том, что Вы только платите за то распространение в прямом и обратном направлениях к SSH при открытии первого файла. Sudo тогда кэширует Ваши учетные данные, и Emacs сохраняет дескриптор, так, чтобы последующие sudo-открытые файлы заняли намного меньше времени.
я не нашел дополнительное время, которое требуется для сохранения обременения, также. Это достаточно быстро, IMO.
Потому что 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.) Он не может неявно преобразовать 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
. Итак, хотя на первый взгляд кажется, что он должен иметь возможность использовать один в качестве другого, между двумя типами есть довольно важные различия.
Это потому, что компилятор выводит 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();
}
(Вам необходимо заменить ?
на соответствующий тип из коллекции Купоны
.)