繁体   English   中英

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

[英]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

LabelControl扩展时,您应该将Control变量( itemLabelLabel

您必须将elementLabel ,以匹配List类型。

labelList.Add((Label) element);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM