【发布时间】:2011-06-24 08:12:34
【问题描述】:
我想知道是否有人能指出我正确的方向......
如何在不迭代或“更新”副本的情况下从 ReadOnlyCollection<myDerivedType> 转换为 ReadOnlyCollection<myBaseType>?
我正在使用 .NET Framework 4.0
【问题讨论】:
标签: c# .net generics collections
我想知道是否有人能指出我正确的方向......
如何在不迭代或“更新”副本的情况下从 ReadOnlyCollection<myDerivedType> 转换为 ReadOnlyCollection<myBaseType>?
我正在使用 .NET Framework 4.0
【问题讨论】:
标签: c# .net generics collections
您可以在 C# 4 中将ROC<Derived> 隐式转换为IEnumerable<Base>,但不能转换为ROC<Base>。
这很不幸;能够对不可变类型进行协变转换真是太好了。
【讨论】:
我不相信你可以,因为通用参数 T 没有定义为 out(正如已经指出的那样,.net 不支持类中的协变和逆变)。
您必须使用 LINQ,例如 readOnlyColl.Cast<myBaseType>();,或循环。在内部,LINQ 会使用循环/迭代,制作一个新副本。
【讨论】:
使用 Linq
yourCollection.Cast<myBaseType>();
【讨论】:
我认为 C# 中不允许泛型类型使用协变和逆变。 泛型不支持这一点——它们是不变的。
我认为只有 C#4 中的泛型委托对协变和逆变的支持有限。
【讨论】:
您不能将ReadOnlyCollection<myDerivedType> 投射到ReadOnlyCollection<myBaseType> 中
【讨论】:
您不能这样做,因此您最好传递IEnumerable<T> 或ICollection<T> 之类的接口,而不是ReadOnlyCollection<T> 之类的具体类。
然后你可以按照其他人的建议:
collection.Cast<myBaseType>();
【讨论】: