【问题标题】:Substituting List<IFoo> with List<Foo that implements IFoo> [duplicate]用实现 IFoo> 的 List<Foo> 替换 List<IFoo> [重复]
【发布时间】:2019-01-01 04:59:39
【问题描述】:

我在用值填充对象时遇到问题。 其中一个属性是List&lt;IFoo&gt; foos

稍后当我想用我的数据库中的数据填充我的模型时,我想在该属性上放置List&lt;Foo&gt;

我认为既然Foo 正确实现了IFoo 接口,这应该可以工作(对吗?)但我收到一个错误,说我不能将List&lt;Foo&gt; 隐式转换为List&lt;IFoo&gt;

我想我正在寻找过去的东西...... 感谢您提前提供帮助

【问题讨论】:

  • 有小代码示例吗?
  • 您无法将 List 转换为 List .. 但您可以转换它:foos.Cast&lt;IFoo&gt;().ToList()
  • 您确定不想转换? List&lt;IFoo&gt; fooBar = myFoos.ToList&lt;IFoo&gt;();
  • 是的,请稍等,我会编辑帖子
  • @PimSchwippert - 没有人比 JonSkeet 解释得更清楚:stackoverflow.com/questions/8925400/cast-listt-to-listinterface

标签: c# interface liskov-substitution-principle


【解决方案1】:

给定类型 IFoo 和 Foo:

interface IFoo
{
}

class Foo : IFoo
{
}

可以创建一个List&lt;IFoo&gt;,填充Foo 的实例并分配给属性/字段/变量:

private List<IFoo> foos;

void GetFoos()
{
    foos = new List<IFoo> { new Foo() };
}

但是你不能List&lt;Foo&gt;分配给List&lt;IFoo&gt;

foos = new List<Foo> { new Foo() };

【讨论】:

    【解决方案2】:

    简单地说,List&lt;Sheep&gt;不是List&lt;IAnimal&gt;,即使每个Sheep 都是IAnimal。因为List&lt;IAnimal&gt; 将允许我使用.Add(new BigBadWolf()),而List&lt;Sheep&gt; 绝不允许。

    您可以通过调用sheep.ToList&lt;IAnimal&gt;() 创建一个 List&lt;IAnimal&gt;,其中包含您所有的Sheep

    【讨论】:

    • 这是一个非常好的、易于理解的示例。
    • 这很好理解。一个问题。如果 Sheep 有属性 bool IsShaved 而 IAnimal 没有,但我知道我的 List&lt;IAnimal&gt; 目前只包含 Sheep,我可以将 List&lt;IAnimal&gt; 转换回 Sheep 以访问属性 IsShaved
    • @PimSchwippert 如果您的动物绝对都是绵羊,您可以使用animalList.Cast&lt;Sheep&gt;() 获取IEnumerable&lt;Sheep&gt;。如果你不确定是否有羊,但你想对所有的羊做点什么,你可以使用animalList.OfType&lt;Sheep&gt;()也得到一个IEnumerable&lt;Sheep&gt;。如果这样做,请不要忘记在文件顶部添加using System.Linq;
    • 好的,非常感谢! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多