【发布时间】:2009-08-18 22:21:51
【问题描述】:
假设我有以下代码:
public class CBase: AbstractC,IRenderable
{
//code here
}
public class CBaseGroup
{
private List<IRenderable> CCollection;
public CBaseGroup(List<IRenderable> c)
{
CCollection=c;
}
}
public class CGroup:CBaseGroup
{
public CGroup(List<CBase> c):base(c)
//here fails because cannot convert List<CBase> to List<IRenderable>
{
}
}
为什么不编译?
请随意提出一个不合适的标题。
从 Matthew Scharley 的回答中我发现代码应该是这样的:
public class CGroup:CBaseGroup
{
public CGroup(List<CBase> c):base(c.Cast<IRenderable>().ToList())
// cast to list since I'm not using IEnumerable
{
}
}
这至少满足编译器。
【问题讨论】:
-
协变和逆变。有没有一个我们可以随时指出的好答案?
-
是的,这是在 C# 3.5 中唯一/最好的方法。希望我们能通过 C# 4.0 获得更好的解决方案(我没有仔细研究它,只是我在这里听到的)。
-
不,我们不会在 C# 4.0 和任何其他类型安全的语言中获得更好的解决方案。见stackoverflow.com/questions/981570/…
标签: c#