无法传递派生列表<>

Tar*_*her 3 c# generics inheritance casting

我有

class A
{}

class B : A
{}
Run Code Online (Sandbox Code Playgroud)

我还有一个需要List参数的方法

void AMethod(List<A> parameter)
{}
Run Code Online (Sandbox Code Playgroud)

为什么我不能

List<B> bs = new List<B>();
AMethod(bs);
Run Code Online (Sandbox Code Playgroud)

其次,最优雅的方式是什么?

问候

Jon*_*eet 7

与其他答案相反,.NET 4.0 支持此功能.只有接口和代理支持通用差异.然而,.NET 4.0 允许你这样做:

void AMethod(IEnumerable<A> parameter) {}
...
List<B> list = new List<B>();
AMethod(list);
Run Code Online (Sandbox Code Playgroud)

在.NET 3.5中,您可以使用以下方法获得相同的功能Cast:

void AMethod(IEnumerable<A> parameter) {}
...
List<B> list = new List<B>();
AMethod(list.Cast<A>());
Run Code Online (Sandbox Code Playgroud)

另一种选择是制作AMethod通用的:

void AMethod<T>(List<T> parameter) where T : A
...
List<B> list = new List<B>();
AMethod(list); // Implicitly AMethod<B>(list);
Run Code Online (Sandbox Code Playgroud)

这可能会或可能不会做你需要的 - 这取决于你在做什么AMethod.如果你需要添加新类型的项目A,你会遇到问题 - 这是正确的.如果你只需要得到物品名单,这将是罚款.


Lar*_*lum 5

您可以使方法签名通用,如下所示:

void AMethod<T>(List<T> parameter) where T : A
{}
Run Code Online (Sandbox Code Playgroud)

或者,您可以等待.NET 4,其中IEnumerable <>支持此方案