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)
其次,最优雅的方式是什么?
问候
与其他答案相反,.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,你会遇到问题 - 这是正确的.如果你只需要得到物品出名单,这将是罚款.
您可以使方法签名通用,如下所示:
void AMethod<T>(List<T> parameter) where T : A
{}
Run Code Online (Sandbox Code Playgroud)
或者,您可以等待.NET 4,其中IEnumerable <>支持此方案