【发布时间】:2012-01-10 20:53:19
【问题描述】:
考虑Label的列表:
Collection<Label> labels = new Collection<Label>();
现在我想将其转换为 Controls 的集合:
public void ScaleControls(ICollection<Control> controls) {}
我会尝试调用:
ScaleControls(labels);
但这不会编译。
ScaleControls((ICollection<Control>)labels);
编译,但在运行时崩溃。
ICollection<Control> controls = (ICollection<Control>)labels;
ScaleControls(c);
编译,但在运行时崩溃。
有没有办法传递对象的通用列表?
替代方法是放弃通用列表,并使用类型列表:
public class ControlList : Collection<Control>
{
}
pubic void InvalidateControls(ControlList controls)
{
}
但这意味着所有使用泛型的代码都必须进行改造。
【问题讨论】:
-
您使用什么版本的 .Net?
-
集合是否必须最初是 Label 类型,还是因为 label 继承自 Control,您可以摆脱 Control?
-
您应该阅读协变和逆变,这可以解决您的问题。可悲的是,如果有任何内置集合正在使用它,那么很少。
-
@JoachimIsaksson 我对它们是什么有一个模糊的理解;但仅在“由于...协变和逆变,CLR 尚不支持您想要做的事情”的上下文中。 “解决我的问题”是不是意味着我会意识到我不能做我想做的事——所以没问题。或者如果我阅读更多关于协变和逆变的信息,有没有办法解决这个问题。
-
@Ian 我认为一些关于协变和逆变的材料解释了为什么从类型安全的角度来看你不应该能够做你要求做的事情。要点是,如果您被允许按照您的要求进行操作,那么您可能会编写代码来将 TextBox 控件添加到 List