有什么办法可以避免在我投射List<T>到我自己的集合时避免额外的演员,这只是一个衍生物List<T>?
ScreenCollection screens = screenRepository.GetAll().ToList();
// fails because ScreenCollection != return of ToList() which is List<Screen>
// However,
public class ScreenCollection : List<Screen>
Run Code Online (Sandbox Code Playgroud)
ScreenCollection screens = (ScreenCollection)screenRepository.GetAll().ToList();
Run Code Online (Sandbox Code Playgroud)
List<T>如果可能的话,我想避免额外的铸造.
这是不可能的,事实上,你的演员也是错的.仅仅因为ScreenCollection派生List<Screen>并不意味着每个List<Screen>实例也都实现了ScreenCollection.
.NET 4.0和C#4将在接口类型上提供逆变和协方差,这将在某种程度上缓解您所面临的情况,但它不会为列表提供差异.
解决您的问题的一种方法是使用扩展方法或构造函数ScreenCollection(取决于您是否拥有代码)可以基于给定IEnumerable<Screen>或创建新实例IList<Screen>.您还可以考虑重构您的ScreenCollection类型(如果它是您的重构),以便它封装List<Screen>而不是从它继承,然后List<Screen>从中包装新实例ToList().
子类化List<T>很少有用 - 除了给它起一个名字; Collection<T>至少可以让你选择覆盖一些东西......
在你的例子中,我假设这.ToList()是LINQ扩展方法 - 在这种情况下,它确实是返回a List<T>,而不是a ScreenColleciton.你可以添加一个隐式转换运算符,但我不认为这是一个好主意(事实证明,这不仅不是一个好主意:它是不可能的;-p credit:Aistina - comments).
如果它不是 LINQ扩展方法 - 那么只需输入它就可以返回正确的东西......
| 归档时间: |
|
| 查看次数: |
263 次 |
| 最近记录: |