2012-11-02 96 views
0

我试图围绕接口包裹头部。我一直在imp on这样的事情:将接口集合添加到接口

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

您是否试过使用Collection 而不是ICollection ? –

+0

你可以发布Foo类吗? –

+0

@Fuex foo类可能是问题的一部分。一会儿。 – Billdr

回答

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>

+0

对于任何后来的人来说都是一个注释:Foo不能有一个名为Bars的属性,它的类型与IFoo的名为Bars的属性不同。 – Billdr

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

您是如何在这里实现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; 
1

它不会以这种方式工作。见,ICollection<T>是不是协变的T,因此一个ICollection<Bar>不是ICollection<IBar>即使BarIBar

这是为什么?想象一下Quux实施IBar。如果您可以将ICollection<Bar>指定为ICollection<IBar>,则某人可以使用ICollection<IBar>.AddQuux插入集合中,因为Quux也是IBar!但这个系列是Bar的集合,所以类型安全性将被打破。

你应该尝试

IBar[] MyBars = {bar1, bar2}; 

这样你MyBars允许其他IBar S的插入,不仅Bar秒。