【发布时间】:2014-10-17 00:02:40
【问题描述】:
我在 Windows 7 上的 Visual Studio 2013 Pro 中使用 C#5/.NET 4.5。
我想处理项目集合,其中唯一的要求是项目实现特定接口。集合中的项目不一定是公共继承树的一部分(即集合不会基于共同的祖先),它们可以是任意类但都将实现指定的接口(因此目标是基于集合在他们都实现的公共接口上)。
我遇到了麻烦。如果我有一个实现所需接口的项目集合,我无法将该集合传递给需要基于该接口的集合的方法。
这里有一些代码可以让这更具体。
using System.Collections.Generic;
class Test
{
public interface IDrawable
{
void Draw();
}
public class Shape : IDrawable
{
public void Draw() {}
}
public void DrawItems(List<IDrawable> itemsToDraw) {}
public Test()
{
List<Shape> shapes = new List<Shape>();
DrawItems(shapes);
}
}
对 DrawItems 的调用会产生编译器错误。该方法需要一组实现 IDrawable 的项目。我正在传递一组 Shape 对象。因为 Shape 对象确实实现了 IDrawable,所以我希望我能摆脱这个。
看起来这行不通,但我试图了解原因。我查找了有关协变和逆变的信息,但没有找到任何专门针对这种情况的信息。
关于为什么这不起作用的任何想法或信息?
【问题讨论】: