我想知道是否有人能指出我正确的方向......
如何在不重复或“新建”副本的情况下从ReadOnlyCollection<myDerivedType>
投射到ReadOnlyCollection<myBaseType>
?
我正在使用.NET Framework 4.0
答案 0 :(得分:10)
您可以隐式将ROC<Derived>
转换为C#4中的IEnumerable<Base>
,但不能转换为ROC<Base>
。
那是不幸的;能够对不可变类型进行协变转换真的很棒。
答案 1 :(得分:1)
我不相信你可以,因为通用参数T没有被定义为out
(正如已经指出的那样.net不支持类中的协方差和反演)。
您必须使用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>();