簡體   English   中英

繼承和通用約束

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM