我一直在努力收集藏品,仿制品和遗产。抱歉,但我不确定如何以正确的方式表达我的问题,但我确信这段代码能够充分显示。
public class A
{
public IList<C> sequenceOfC;
public A(IList<C> sequenceOfC)
{
this.sequenceOfC = sequenceOfC;
}
}
public class B : A {
public B(IList<D> sequanceOfC) : base(sequanceOfC) { } //compile time error
// Error 2 Argument 1: cannot convert from
// 'System.Collections.Generic.IList<ConsoleApplication.D>'
// to 'System.Collections.Generic.IList<ConsoleApplication.C>'
}
public class C { }
public class D : C { }
我无法理解为什么我会看到这个错误。 C D继承自C,一切都应该继续,不是吗?
答案 0 :(得分:1)
问题是IList
不是协变的。因此,编译器无法确保D
在任何情况下都可以转换为C
。解决方案是使用IEnumerable<C>
初始化您的列表:
public class A
{
public IList<C> sequanceOfC;
public A(IEnumerable<C> sequanceOfC)
{
this.sequanceOfC = new List<C>(sequanceOfC);
}
}
public class B : A
{
public B(IList<D> sequanceOfD) : base(sequanceOfD) { }
}
答案 1 :(得分:1)
如果D继承自C,并且IList是协变的,那么你可以写:
public class E : C
{}
IList<D> source = new List<D>();
IList<C> target = source;
target.Add(new E());
这显然是错误的,因为您要将E添加到D
列表中