C#将子列表用作基列表的过程

C#将子列表用作基列表的过程,c#,list,polymorphism,parameter-passing,covariance,C#,List,Polymorphism,Parameter Passing,Covariance,我有一个基类型B和多个派生子类型C1:B、C2:B、C3:B等 我有每个子类型的列表,ListL1、ListL2、ListL3 对于每个子类型,我都有工作函数F1、F2、F3,它们为该子类型获取相应的列表L1、L2、L3,并完成本质上相同的功能(仅处理B的属性),但对于相应的类型C1、C2、C3 我希望有一个单一的函数,基于基本类型的列表,列表“多态”执行独立于子类型的函数 我知道,通过使用模板说明符修复函数声明,我应该能够将列表传递到函数中,例如: public void Fn<T>

我有一个基类型B和多个派生子类型C1:B、C2:B、C3:B等

我有每个子类型的列表,ListL1、ListL2、ListL3

对于每个子类型,我都有工作函数F1、F2、F3,它们为该子类型获取相应的列表L1、L2、L3,并完成本质上相同的功能(仅处理B的属性),但对于相应的类型C1、C2、C3

我希望有一个单一的函数,基于基本类型的列表,列表“多态”执行独立于子类型的函数

我知道,通过使用模板说明符修复函数声明,我应该能够将列表传递到函数中,例如:

public void Fn<T>(List<T> BList) { /* do stuff */ }
public void Fn(List BList){/*do stuff*/}
我希望我的每个子函数,F1,F2,F3,调用基函数,比如

public void F1(List<C1> L1)
{
     Fn(L1);  // this is the line that fails
}
public void F1(列表L1)
{
Fn(L1);//这是失败的一行
}
我试着重铸为基本类型,B

Fn( (List<B>)L1 );
Fn((列表)L1);
但是,我得到一个错误,说明我无法将类型“System.Collections.Generic.List”转换为“System.Collections.Generic.List”,即使C1是从B派生的

我还尝试在Fn名称中插入类型:

Fn<C1>( L1 );

Fn<C1>(  (List<B>)L1 );
Fn(L1);
Fn((列表)L1);
我发现一些建议说,我应该将我的子列表转换为基类列表(这对我来说是失败的),在我的泛型函数Fn中,检查我传递的列表是否属于特定类型,然后执行特定于该类型的单独代码。除了按建议对我不起作用的强制转换之外,这似乎打破了OOP的多态性,在泛型函数中仍然有子类特定的代码

我希望有一些真正的抽象/泛型方法可以避免重复代码,从而将我的子列表视为基本列表

谁能告诉我如何做到这一点


谢谢。

使用
IList
而不是
列表
。选中

首先阅读本文:

简而言之,即使
C:B
List
不能被引用为
List
但是
IEnumerable
可以(阅读上述文章了解原因)

然后您可以使用:

public void Fn(IEnumerable<B> BList) { /* do stuff */ }
public void Fn(IEnumerable BList){/*do stuff*/}

IList
仍然不是协变的。