3

我正在写以下内容

if(this.tabControl1.TabPages.Count != ImagesList.Count())
{
    foreach (var item in this.tabControl1.TabPages)
    {

    }
}

而且我无法使用 item 访问每个项目内的控件。但是通过定义它的类型

if(this.tabControl1.TabPages.Count != ImagesList.Count())
{
    foreach (TabPage item in this.tabControl1.TabPages)
    {

    }
}

我可以使用轻松访问它们item.Controls

所以我想知道为什么我真的需要将这些项目定义/转换为TabPage,编译器/intellasense 不应该弄清楚它,因为里面this.tabControl1.TabPages的每个项目实际上都是一个TabPage

4

2 回答 2

3

因为TabControl.TabPages返回一个TabPageCollection不实现强类型 但返回对象IEnumerable<T>的非泛型 接口。IEnumerable

因此,如果您在中提供类型,foreach它将被隐式转换。如果你不提供它的类型object,你需要稍后再转换它。

阅读C# 语言规范,8.8.4了解更多信息。

您还可以使用 Linq 扩展方法Enumerable.Cast

foreach (var item in this.tabControl1.TabPages.Cast<TabPage>())
{
    // item is TabPage
}

如果您想使用 Linq,这很方便:

var tabs =  this.tabControl1.TabPages.Cast<TabPage>()
     .Where(tp => tp.Name.StartsWith("MyTabPage"));
于 2013-10-02T09:22:31.957 回答
0

你想这样做吗?

foreach (TabPage t in tabControl1.TabPages)
{
    foreach (Control c in t.Controls)
    {
        string a = c.Name;
    }
}
于 2013-10-02T09:29:34.137 回答