将ReadOnlyCollection <derivedtype>转换为ReadOnlyCollection <basetype> </basetype> </derivedtype>

时间:2011-06-24 08:12:34

标签: c# .net generics collections

我想知道是否有人能指出我正确的方向......

如何在不重复或“新建”副本的情况下从ReadOnlyCollection<myDerivedType>投射到ReadOnlyCollection<myBaseType>

我正在使用.NET Framework 4.0

6 个答案:

答案 0 :(得分:10)

您可以隐式将ROC<Derived>转换为C#4中的IEnumerable<Base>,但不能转换为ROC<Base>

那是不幸的;能够对不可变类型进行协变转换真的很棒。

答案 1 :(得分:1)

我不相信你可以,因为通用参数T没有被定义为out(正如已经指出的那样.net不支持类中的协方差和反演)。

ReadOnlyCollection<T>

您必须使用LINQ,例如readOnlyColl.Cast<myBaseType>();或循环。 LINQ内部将使用循环/迭代,制作新副本。

答案 2 :(得分:0)

与Linq

yourCollection.Cast<myBaseType>();

答案 3 :(得分:0)

您不能将ReadOnlyCollection<myDerivedType>投射到ReadOnlyCollection<myBaseType>

答案 4 :(得分:0)

我认为C#中的泛型类型不允许协方差和逆变。 泛型不支持这个 - 他们是不变的

我认为只有C#4中的通用代表对协方差和逆变的支持才有限。

答案 5 :(得分:0)

你不能这样做,所以你最好不要传递IEnumerable<T>ICollection<T>等接口而不是像ReadOnlyCollection<T>这样的具体类。

然后你可以做,正如其他人所建议的那样:

collection.Cast<myBaseType>();