鉴于以下类别:
public class ContentItem : IEquatable<ContentItem>
{
...
}
和
public class Widget : ContentItem, IWidget
{
...
}
为什么我不能这样做:
List<Widget> widgets = _repository.GetItems(widgetType);
,其中
_repository.GetItems(widgetType)
会返回IEnumerable<ContentItem>
吗?
基本上我已经有了一个适用于ContentItem
类的存储库实现,我也想使用同一个存储库来处理Widget
类,因为Widget具有相同的基本属性,并且只引入了一些新的只包含一些信息(它们来自IWidget
接口)并且对存储库应该如何处理类没有任何影响)。我不想创建另一个存储库类只是用ContentItem
替换Widget
的所有出现。
我应该通过显式指定强制转换或更改我的存储库(或存储库接口,我也有)来进行更改吗?如果可能的话,我想避免各种构造,如AsEnumerable(),ToList()或显式转换。
答案 0 :(得分:2)
因为ContentItem
不是Widget
- 反之亦然。即使这样IEnumerable<ContentItem>
与List<Widget>
不同,您也可以通过这样的方式实现您想要的目标:
List<Widget> widgets = _repository.GetItems(widgetType)
.OfType<Widget>()
.ToList();
但是只有如果你才真正返回枚举,其中每个ContentItem
真的是Widget
。