将List <ifoo>替换为List <foo that =“” Implements =“” ifoo =“”>

时间:2018-07-24 14:12:25

标签: c# interface liskov-substitution-principle

我在用值填充对象时遇到问题。 属性之一是# check that there are no repeats for col in ("name_1", "name_2"): assert df[col].dropna().nunique() == df[col].dropna().shape[0] # check that all `name_1`s have corresponding `name_2`s assert set(df["name_1"].dropna()) == set(df["name_2"].dropna())

稍后,当我想用​​数据库中的数据填充模型时,我想在该属性上放置List<IFoo> foos

我认为,由于List<Foo>正确实现了Foo接口,这应该可以工作(对吗?),但是我收到一条错误消息,说我无法将IFoo隐式转换为{{1} }

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

2 个答案:

答案 0 :(得分:2)

简而言之,即使每个List<Sheep>是一个List<IAnimal>Sheep也不是IAnimal。因为List<IAnimal>会让我.Add(new BigBadWolf())永远不允许的List<Sheep>

您可以做的是通过调用List<IAnimal>创建一个包含所有Sheep sheep.ToList<IAnimal>()

答案 1 :(得分:0)

给出类型IFoo和Foo:

interface IFoo
{
}

class Foo : IFoo
{
}

可以创建List<IFoo>,填充Foo的实例,然后将其分配给属性/字段/变量:

private List<IFoo> foos;

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

但是您不能List<Foo>分配给List<IFoo>

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