1

例えば:

public interface IFoo
{
    //...

    ICollection<IFoo> Children { get; }

    //...
}

public class Foo : IFoo
{
    //...

    public ICollection<Foo> Children { get; private set; }

    //...

    public ICollection<IFoo> IFoo.Children
    {
        get
        {
            return Children; // Obviously wrong datatype, how do I cast this?
        }
    }

    //...
}

では、どうすれば正しく実装できIFoo.Childrenますか? 私は試しChildren.Cast<IFoo>ましたが、これは代わりにを返しますIEnumerable<IFoo>

4

2 に答える 2

5

これをよく考える必要があります。このキャストが機能する場合、コードは完全に異なるクラス オブジェクトをコレクションに追加することができます。つまり、IFoo を実装しているが、それ以外は Foo とはまったく関係のないオブジェクトです。コレクションは Foo のコレクションではなくなります。それはもちろん許されません。IEnumerable<> は問題ありません。コレクションを変更することはできません。ICollection<> ではありません。

必要なものを取得する唯一の方法は、コレクションのコピーを作成することです。のようにList<IFoo>。もちろん、そのためのパフォーマンスを支払うことになります。そして、そのリストへの変更を簡単に見ることができません。これは修正可能です。しかし、クライアント コードがそのリストを変更しても、対処方法がわからないオブジェクトを追加または削除できるという根本的な問題は依然として存在します。

于 2012-12-17T13:45:23.880 に答える
3

試してみてくださいChildren.Cast<IFoo>().ToList()

于 2012-12-17T13:13:16.630 に答える