[英]Inheritance and generic constraints
我一直在努力收集藏品,仿制品和遺產。 對不起,但我不確定如何以正確的方式表達我的問題,但我確信這段代碼顯示得足夠多。
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 { }
我無法理解為什么我會看到這個錯誤。 CD繼承自C,一切都應該繼續,不是嗎?
問題是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) { }
}
如果D繼承自C,並且IList是協變的,那么你可以寫:
public class E : C
{}
IList<D> source = new List<D>();
IList<C> target = source;
target.Add(new E());
這顯然是錯誤的,因為你要將E添加到D列表中
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.