我试图绕过界面。我一直在磕磕绊绊这样的事情:
public interface IFoo
{
ICollection<IBar> Bars { get; set; }
//some other properties
}
public interface IBar
{
//some properties
}
//assume Bar is implemented and extends IBar. Some instaces of Bar are created
Bar[] MyBars = {bar1, bar2};
Foo MyFoo = new Foo();
MyFoo.Bars=MyBars.ToList(); //This causes an error saying Collection<Bar> cannot be
//assigned to ICollection<IBar>.
我完全不知道如何正确地做到这一点。填充接口集合的正确方法是什么?
编辑:我实施Foo的方式可能是问题的一部分。
public class Foo : IFoo
{
public ICollection<IBar> Bars { get; set; }
}
答案 0 :(得分:1)
按照你的方式,你可以这样做:
ICollection<Bar> MyBars = new Bar[] {bar1, bar2};
MyFoo.Bars = MyBars;
您也可以这样做,以编程方式可能更适合您:
List<Bar> lstBar = new List<Bar>();
lstBar.Add(bar1);
lstBar.Add(bar2);
MyFoo.Bars = lstBar;
整个来源:
public interface IFoo
{
ICollection<IBar> Bars { get; set; }
}
public interface IBar
{
}
public class Foo : IFoo
{
public ICollection<IBar> Bars { get; set; }
}
public class Bar : IBar
{
}
class Program
{
static void Main(string[] args)
{
IFoo myFoo = new Foo();
List<IBar> lstBar = new List<IBar>();
lstBar.Add(new Bar());
myFoo.Bars = lstBar;
}
}
答案 1 :(得分:1)
问题是Foo
类应该是:
public class Foo : IFoo
{
public ICollection<Bar> Bars { get; set; }
}
或者如果您想使用ICollection<IBar>
:
IBar[] MyBars = { bar1, bar2 };
Foo MyFoo = new Foo( );
MyFoo.Bars = MyBars.ToList( );
或者更优雅的解决方案:
Bar[] MyBars = { bar1, bar2 };
Foo MyFoo = new Foo( );
MyFoo.Bars = MyBars.ToList<IBar>( ); //Cast from Bar to IBar
事实上,问题发生了,因为您无法将ICollection<Bar>
转换为ICollection<IBar>
。
答案 2 :(得分:1)
您如何在此处实现Bars属性。您不能将具体类型分配给接口类型。当您尝试执行ToList转换时,您将其转换为具体列表类型并尝试将其分配给ICollection接口类型,因此它会生成错误。
以下内容应该可以正常使用。
public class Foo:IFoo
{
public ICollection<IBar> Bars { get; set; }
}
Bar bar1 = new Bar();
Bar bar2 = new Bar();
Bar[] MyBars = { bar1, bar2 };
Foo MyFoo = new Foo();
MyFoo.Bars = MyBars;
答案 3 :(得分:1)
它不会以这种方式工作。请注意,ICollection<T>
不是T
的协变,因此ICollection<Bar>
不是ICollection<IBar>
,即使Bar
是IBar
。
为什么会这样?想象一下,有一些Quux
正在实施IBar
。如果您可以将ICollection<Bar>
分配给ICollection<IBar>
,则有人可以使用Quux
将ICollection<IBar>.Add
插入到集合中,因为Quux
也是IBar
!但该集合是Bar
的集合,因此类型安全性将被打破。
你应该试试
IBar[] MyBars = {bar1, bar2};
这样,您MyBars
就可以插入其他IBar
,而不仅仅是Bar
。