为什么一个对象没有强烈地键入一个带有var的foreach?

时间:2013-10-02 09:19:31

标签: c# winforms controls tabpage member-access

我正在撰写以下内容

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不应该将其计算为{{1}内的每个项目实际上是this.tabControl1.TabPages

2 个答案:

答案 0 :(得分:3)

因为TabControl.TabPages返回的TabPageCollection没有实现强类型IEnumerable<T>,而是返回返回对象的非通用IEnumerable接口。

因此,如果您在foreach中提供类型,则会被隐含地投放。如果你没有提供类型,那么它的类型是object,你需要稍后再进行投射。

阅读C# language spec, 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"));

答案 1 :(得分:0)

你想要这个吗?

foreach (TabPage t in tabControl1.TabPages)
{
    foreach (Control c in t.Controls)
    {
        string a = c.Name;
    }
}