[英]Why can't I add a Form label to my Label list?
我在这里得到了这个代码,并没有按照它应该的方式工作:
private void Form1_Load(object sender, EventArgs e)
{
weather = new Weather();
dynamic weatherObject = weather.refreshData();
gui = new GUICreator(weatherObject);
List<Label> labelList = new List<Label>();
foreach(Control element in this.Controls)
{
if (element.GetType() == typeof(Label))
{
labelList.Add(element);
}
}
}
问题主要是循环,它应该用我表单中的所有可用标签填充列表,以便准备好传递给其他类。
但是,我总是在labelList.Add(element)
行中得到一个错误,它是:“System.Collections.Generic ....的最佳重载方法匹配有一些无效的参数”。
我不知道这里出了什么问题。 我仔细检查了该元素在该特定行是否是正确的类型,并且它确实总是一个Label。 怎么了? 我不记得要向List.add添加另一个东西,除了要添加的元素?
问题在于编译器看到一个Control
对象被添加到List<Label>
。 编译器无法查看您的代码并从您的逻辑中了解您只添加了标签。 相反,如果你写
foreach(var element in this.Controls.OfType<Label>())
{
labelList.Add(element);
}
现在您向编译器提供了足够的信息,它可以理解您正在添加标签而不是通用控件
并且,如下面从ASh所述 ,如果你的意图只是让List<Label>
没有进一步处理,那么你可以只写一行
List<Label> labelList = this.Controls.OfType<Label>().ToList();
这是List<T>.Add
方法背后的代码:
public class List<T>
{
public void Add(T item)
{
if (this._size == this._items.Length)
{
this.EnsureCapacity(this._size + 1);
}
this._items[this._size++] = item;
this._version++;
}
}
如您所见,它只接受您在初始化列表时设置的类型为T的参数。
List<Label> labelList = new List<Label>();
现在,当循环遍历元素时,您指定要迭代的项目是Control
类型。 在List中, T
不是Control
,因为它的类型为Label
。
您必须将element
为Label
,以匹配List
类型。
labelList.Add((Label) element);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.