隐式类型转换不起作用

时间:2016-04-21 14:11:34

标签: c#

我有一个名为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无法转换   'System.Collections.Generic.List'到   'System.Collections.Generic.List'

     

错误CS1503:参数2无法从System.Collections.Generic.List转换为   System.Collections.Generic.List

有没有办法在没有明确的类型转换的情况下解决这个问题? 我需要在没有明确的类型转换的情况下工作。

3 个答案:

答案 0 :(得分: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 :(得分: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);

答案 2 :(得分: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; }
}