在C#中,将ICollection <X>转换为ICollection <Y>的正确方法是什么?

Mat*_*att 1 .net c# interface

例如:

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?
        }
    }

    //...
}
Run Code Online (Sandbox Code Playgroud)

那么我该如何正确实施IFoo.Children呢?我尝试了,Children.Cast<IFoo>但这会返回一个IEnumerable<IFoo>.

Han*_*ant 5

你需要考虑一下.如果这个强制转换可以工作,那么代码将被允许为你的集合添加一个完全不同的类对象,一个实现IFoo,但与Foo完全无关.您的收藏品现在将不再是Foo的集合.那当然是不允许的.IEnumerable <>很好,不能改变集合.ICollection <>不是.

获得所需内容的唯一可能方法是创建集合的副本.像一个List<IFoo>.你当然会为此支付费用.并且不能轻易看到该列表的更改,这是可修复的.但是你仍然有一个基本问题,即客户端代码修改该列表仍然允许添加或删除你不知道如何处理的对象.