我有一个名为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>
),则可以毫无问题地传递Product
或DifferentProduct
列表。
像这样:
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; }
}