0

インターフェイスに頭を悩ませようとしています。私は次のようなものを実装することにつまずき続けています:

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; }
}
4

4 に答える 4

1

このようには機能しません。を参照してください。ICollection<T>はで共変ではないTため、ICollection<Bar>はですが、はではICollection<IBar>ありません。BarIBar

なんでそうなの?Quuxいくつかの実装があると想像してくださいIBar。に割り当てることができればICollection<Bar>ICollection<IBar>誰かがQuuxを使用してコレクションにを挿入する可能性があります。ICollection<IBar>.Addこれもです。ただし、コレクションはsのコレクションであるため、型安全性が損なわれます。QuuxIBarBar

試してみてください

IBar[] MyBars = {bar1, bar2};

このようにして、sだけでなくMyBars他のsの挿入を許可します。IBarBar

于 2012-11-02T11:55:30.287 に答える
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;
    }
}
于 2012-11-02T11:29:06.147 に答える
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>

于 2012-11-02T11:41:18.000 に答える