Question

i was writing the following

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

    }
}

and i couldn't access the controls inside each item using item. But with a defining it's type like

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

    }
}

i could easily access them using item.Controls

so i was wondering why do i really need to define/cast those items as TabPage, shouldn't the compiler/intellasense figure it out as each item inside this.tabControl1.TabPages is actually a TabPage ?

Was it helpful?

Solution

Because TabControl.TabPages returns a TabPageCollection which does not implement the strongly typed IEnumerable<T> but the non-generic IEnumerable interface which returns an object.

So if you provide the type in the foreach it will be casted implicitely. If you don't provide the type it's type is object and you need to cast it later.

Read C# language spec, 8.8.4 for more informations.

You could also use the Linq extension method Enumerable.Cast:

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

It's handy especially if you want use Linq:

var tabs =  this.tabControl1.TabPages.Cast<TabPage>()
     .Where(tp => tp.Name.StartsWith("MyTabPage"));

OTHER TIPS

Do you want to to this?

foreach (TabPage t in tabControl1.TabPages)
{
    foreach (Control c in t.Controls)
    {
        string a = c.Name;
    }
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top