为什么我不能在表单标签中添加表单标签?

时间:2015-04-26 19:04:39

标签: c# winforms

我在这里得到了这个代码而且它的工作方式并没有真正发挥作用:

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添加另一个东西吗?

3 个答案:

答案 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)转换为LabelLabelControl延伸。

答案 2 :(得分:0)

您已将element投射至Label,以匹配List类型。

labelList.Add((Label) element);
相关问题