我在这里得到了这个代码而且它的工作方式并没有真正发挥作用:
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)
行收到错误,这是:&#34; System.Collections.Generic ....的最佳重载方法匹配有一些无效的参数&#34;。< / p>
我不知道这里出了什么问题。我仔细检查了该元素在该特定行是否是正确的类型,并且它确实总是一个Label。怎么了?我不记得除了要添加的元素之外还要向List.add添加另一个东西吗?
答案 0 :(得分:2)
问题在于编译器看到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();
答案 1 :(得分:1)
这是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
类型。在列表中,T
不是Control
,而是Label
类型。
您应该将Control
变量(item
)转换为Label
,Label
从Control
延伸。
答案 2 :(得分:0)
您已将element
投射至Label
,以匹配List
类型。
labelList.Add((Label) element);