隐式类型转换不起作用



我有一个名为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' to 'System.Collections.Generic.List '

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

有没有办法在没有显式类型转换的情况下制定此解决方案?我需要在没有显式类型转换的情况下工作。

试试这个:

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

那是因为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);

尝试使用泛型:

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; }
}

相关内容

最新更新