继承和通用约束

时间:2014-05-08 09:26:07

标签: c# generics inheritance collections

我一直在努力收集藏品,仿制品和遗产。抱歉,但我不确定如何以正确的方式表达我的问题,但我确信这段代码能够充分显示。

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,一切都应该继续,不是吗?

2 个答案:

答案 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

列表中