i have project interface definitions: rivworks.interfaces
have project define concrete implmentations: rivworks.dto
i've done hundreds of times before reason getting error now:
cannot implicitly convert type 'system.collections.generic.list<rivworks.dto.product>' 'system.collections.generic.list<rivworks.interfaces.datacontracts.iproduct>'
interface definition (shortened):
namespace rivworks.interfaces.datacontracts { public interface iproduct { [xmlelement] [datamember(name = "id", order = 0)] guid productid { get; set; } [xmlelement] [datamember(name = "altid", order = 1)] long alternateproductid { get; set; } [xmlelement] [datamember(name = "companyid", order = 2)] guid companyid { get; set; } ... } } concrete class definition (shortened):
namespace rivworks.dto { [datacontract(name = "product", namespace = "http://rivworks.com/datacontracts/2009/01/15")] public class product : iproduct { #region constructors public product() { } public product(guid productid) { initialize(productid); } public product(string sku, guid companyid) { using (riventities _dbriv = new rivworksstore(stores.rivconnstring).negotiationentities()) { model.product rivproduct = _dbriv.product.where(a => a.sku == sku && a.company.companyid == companyid).firstordefault(); if (rivproduct != null) initialize(rivproduct.productid); } } #endregion #region private methods private void initialize(guid productid) { using (riventities _dbriv = new rivworksstore(stores.rivconnstring).negotiationentities()) { var localproduct = _dbriv.product.include("company").where(a => a.productid == productid).firstordefault(); if (localproduct != null) { var companydetails = _dbriv.vwcompanydetails.where(a => a.companyid == localproduct.company.companyid).firstordefault(); if (companydetails != null) { if (localproduct.alternateproductid != null && localproduct.alternateproductid > 0) { using (feedsentities _dbfeed = new feedstorereadonly(stores.feedconnstring).readonlyentities()) { var feedproduct = _dbfeed.autowithimage.where(a => a.clientid == companydetails.clientid && a.autoid == localproduct.alternateproductid).firstordefault(); if (companydetails.usezerogsppath.value || feedproduct.guaranteedsaleprice > 0) // kab: 2010.04.07 - new rules... populateproduct(feedproduct, localproduct, companydetails); } } else { if (companydetails.usezerogsppath.value || localproduct.lowestprice > 0) // kab: 2010.04.07 - new rules... populateproduct(localproduct, companydetails); } } } } } private void populateproduct(rivworks.model.entities.product product, rivworks.model.entities.vwcompanydetails rivcompany) { this.productid = product.productid; if (product.alternateproductid != null) this.alternateproductid = product.alternateproductid.value; this.backgroundcolor = product.backgroundcolor; ... } private void populateproduct(rivworks.model.entities.autowithimage feedproduct, rivworks.model.entities.product rivproduct, rivworks.model.entities.vwcompanydetails rivcompany) { this.alternateproductid = feedproduct.autoid; this.backgroundcolor = helpers.product.getcorrectvalue(rivcompany.defaultbackgroundcolor, rivproduct.backgroundcolor); ... } #endregion #region iproduct members public guid productid { get; set; } public long alternateproductid { get; set; } public guid companyid { get; set; } ... #endregion } } in class have:
using dto = rivworks.dto; using contracts = rivworks.interfaces.datacontracts; ... public static list<contracts.iproduct> get(guid companyid) { list<contracts.iproduct> mylist = new list<dto.product>(); ... any ideas why might happening? (and sure trivially simple!)
yep it's covariance limitation in c#. can't convert list of 1 type list of another.
instead of:
list<contracts.iproduct> mylist = new list<dto.product>(); you have this
list<contracts.iproduct> mylist = new list<contracts.iproduct>(); mylist.add(new dto.product()); eric lippert explains why implemented way: http://blogs.msdn.com/ericlippert/archive/tags/covariance+and+contravariance/default.aspx
(and why different working arrays of items).
Comments
Post a Comment