2016-04-21 67 views
0

我有一個叫Product的抽象類,叫做DifferentProduct的另一個類和一個叫IProduct的接口。隱式類型轉換不起作用

類別Product和類別DifferentProduct均來自名爲IProduct的接口。

public class Product : IProduct 
{ 
    public int ID { get; set; } 
    public string ProductName { get; set; } 
} 

public class DifferentProduct : IProduct 
{ 
    public int ID { get; set; } 
} 


public interface IProduct 
{ 
    int ID { get; set; } 
} 

我有功能,即我傳遞

ProductListing(List<IProduct>, List<IProduct>) 
    { 

    } 

現在試圖調用函數從一些文件

List<Product> productList1; 
    List<DifferentProduct> differentProductList; 

    XYZ.ProductListing(productList1, differentProductList); 

我在上面一行得到以下錯誤

錯誤CS1503:參數1無法從012轉換'System.Collections.Generic.List' 到 'System.Collections.Generic.List'

錯誤CS1503:參數2無法從System.Collections.Generic.List轉換爲 System.Collections.Generic.List

有沒有什麼辦法可以解決這個解決方案沒有明確的類型轉換? 我需要工作,沒有明確的類型轉換。

+2

閱讀有關協變和逆變。 https://msdn.microsoft.com/en-us/library/dd799517(v=vs.110).aspx – Andrew

+0

此問題肯定是一些共同/反差異問題的副本 –

+0

蘋果列表不是列表水果。您可以將桔子添加到水果列表中,但您的蘋果列表不能接受該列表。 DifferentProduct的列表是相同的。使用產品列表的人可能希望能夠將Widget添加到列表中,但是您只給予(或者試圖給予)其可以接受DifferentProduct的列表。 –

回答

2

試試這個:

var productList1 = new List<IProduct>(); 
productList1.Add(new Product()); 

var differentProductList = new List<IProduct>(); 
differentProductList.Add(new DifferentProduct)(); 

XYZ.ProductListing(productList1, differentProductList); 

你也可以做這樣的事情:

ProductListing<T, U>(List<T> list1, List<U> list2) where T : IProduct, U : IProduct 
1

這是因爲List<Product>不是List<IProduct>,與List<DifferentProduct>相同。

如果參數類型ProductListing(...)可以改變一個協接口像IEnumerable<IProduct>IReadOnlyList<IProduct>那麼你可以傳遞的ProductDifferentProduct名單沒有問題。

事情是這樣的:

void ProductListing(IReadOnlyList<IProduct> list1, IReadOnlyList<IProduct> list2) 
{ 
    ... 
} 

那麼這是可能的:

List<Product> productList1; 
List<DifferentProduct> differentProductList; 

XYZ.ProductListing(productList1, differentProductList); 
0

嘗試使用泛型:

class Program 
{ 
    static void Main(string[] args) 
    { 
     test t = new test(); 
     List<Product> productList1 = new List<Product>(); 
     List<DifferentProduct> differentProductList = new List<DifferentProduct>(); 

     t.ProductListing(productList1, differentProductList); 
    } 
} 

public class test 
{ 
    public void ProductListing<T, U>(List<T> list1, List<U> list2) 
     where T : IProduct 
     where U : IProduct 
    { 

    } 
} 

public abstract class Product : IProduct 
{ 
    public int ID { get; set; } 
    public string ProductName{ get; set; } 
} 

public class DifferentProduct : IProduct 
{ 
    public int ID{get; set;} 
} 


public interface IProduct 
{ 
    int ID { get; set; } 
} 
+0

該代碼工作正常,你可以測試它 – MSE

+0

我的不好,一般的約束有時讓我絆倒。我個人將方法參數設置爲某種協變接口類型,儘管如此,我認爲這裏不需要泛型。我發現有很少的情況下,我真的想在方法簽名中使用具體的'List '。 – kai

+0

我這樣做了,因爲他想要的是調用ProductListing方法,其約束條件是List中的類型是IProduct接口的實現。 – MSE