(这是.Net 3.5)我有一个实现IList的类FooList和一个实现IFoo的类FooClass。用户需要IList<IFoo>
。在我的实现中,我创建了一个名为X的FooList<FooClass>
。如何对我的回复进行编码,以便我的FooList<FooClass> X
成为他的IList<IFoo>
?
如果我尝试
返回X.Cast()。ToList();
他得到IList<IFoo>
,但它不是我的FooList;它是一个List,也是一个新的。
答案 0 :(得分:1)
这不会有效,因为FooList<FooClass>
不是IList<IFoo>
。这就是原因:
var myList = new FooList<FooClass>();
IFoo obj = new SomeOtherFooClass();
IList<IFoo> result = (IList<IFoo>)myList; // hypothetical, wouldn't actually work
result.Add(obj); // uh-oh, now myList has SomeOtherFooClass
您需要制作副本或使用对所包含类型实际协变的接口,例如IEnumerable<T>
而不是IList<T>
。或者,如果合适,您应该从一开始就将FooList<FooClass>
声明为FooList<IFoo>
。
这是一个小实现,演示了我的第二个建议:
public interface IFoo { }
public class FooClass : IFoo { }
public class FooList<T> : IList<T>
{
public void RemoveAt(int index) { /* ... */ }
/* further boring implementation of IList<T> goes here */
}
public static void ListConsumer(IList<IFoo> foos)
{
foos.RemoveAt(0); // or whatever
}
public static IList<IFoo> ListProducer()
{
// FooList<FooClass> foos = new FooList<FooClass>(); // would not work
FooList<IFoo> foos = new FooList<IFoo>();
foos.Add(new FooClass());
return foos; // a FooList<IFoo> is an IList<IFoo> so this is cool
}
public static void Demo()
{
ListConsumer(ListProducer()); // no problemo
}