簡體   English   中英

將繼承的類型與C#集合通用類型參數一起使用

[英]Using inherited types with C# collection generic type parameters

我有一個抽象類,其中有一些繼承類,例如:

internal abstract class SomeBaseType {}
internal class FirstSpecificType : SomeBaseType {}
internal class SecondSpecificType : SomeBaseType {}
internal class ThirdSpecificType : SomeBaseType {}

以及具有受約束的通用類型參數的類:

internal class SomeCollection<T> : ICollection<SomeDataStructure>
    where T : SomeBaseType {}

我創建了一個List<SomeCollection<SomeBaseType>>並嘗試添加各種繼承類的元素SomeBaseType但我得到以下錯誤( CS1503CS1950 ):

Argument 1: cannot convert from 'Namespace.SomeCollection<FirstSpecificType>' to 'Namespace.SomeCollection<SomeBaseType>'
The best overloaded Add method 'List<SomeCollection<SomeBaseType>>.Add(SomeCollection<SomeBaseType>)' for the collection initializer has some invalid arguments

由於FirstSpecificTypeSomeBaseType ,我應該能夠做到,對吧? 這基本上與向IList<object>添加任意object集相同。


對於其他上下文,出現此錯誤的代碼如下所示:

protected Constructor()
{
    collectionOne = new SomeCollection<FirstSpecificType>();
    collectionTwo = new SomeCollection<SecondSpecificType>();
    collectionThree = new SomeCollection<ThirdSpecificType>();

    allCollections = new List<SomeCollection<SomeBaseType>>
    {
        // Each of these three collections has the error
        collectionOne,
        collectionTwo,
        collectionThree
    };
}

這是協方差和矛盾的問題,基本上說,雖然FirstSpecificType確實是SomeBaseTypeSomeCollection<FirstSpecificType> 嚴格不是 SomeCollection<SomeBaseType>

埃里克·利珀特(Eric Lippert)為此和長頸鹿寫了一些很棒的文章 ,我建議大家至少閱讀一次:-)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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