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 回答