Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

I have a project with all my Interface definitions: RivWorks.Interfaces
I have a project where I define concrete implmentations: RivWorks.DTO

I've done this hundreds of times before but for some reason I am getting this error now:

Cannot implicitly convert type 'System.Collections.Generic.List<RivWorks.DTO.Product>' to '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 another class I 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 this might be happening? (And I am sure it is something trivially simple!)

like image 746
Keith Barrows Avatar asked Apr 14 '10 20:04

Keith Barrows


People also ask

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

Why is C named so?

Quote from wikipedia: "A successor to the programming language B, C was originally developed at Bell Labs by Dennis Ritchie between 1972 and 1973 to construct utilities running on Unix." The creators want that everyone "see" his language. So he named it "C".


1 Answers

Yep it's a covariance limitation in C#. You can't convert a list of one type to a list of another.

Instead of:

List<contracts.IProduct> myList = new List<dto.Product>(); 

You have to do this

List<contracts.IProduct> myList = new List<contracts.IProduct>();  myList.Add(new dto.Product()); 

Eric Lippert explains why they implemented it this way: http://blogs.msdn.com/ericlippert/archive/tags/Covariance+and+Contravariance/default.aspx

(And why it is different than working with arrays of items).

like image 124
kemiller2002 Avatar answered Sep 30 '22 01:09

kemiller2002