2012-11-02 187 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秒。