interface - C# - Cannot implicitly convert type List<Product> to List<IProduct> -


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