2013-10-02 8 views
3

я писал следующееПочему объект не сильно набрал foreach с var?

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

    } 
} 

и я не мог доступ к элементам управления внутри каждого элемента с помощью элемента. Но определяющим это типа как

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

    } 
} 

я мог легко получить доступ к ним с помощью item.Controls

так мне было интересно почему я на самом деле нужно определить/отбрасывать те предметы, TabPage, не должны компилятор/intellasense выяснить, как каждый элемент внутри this.tabControl1.TabPages на самом деле TabPage?

ответ

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

Я не ожидал получить такой полезный ответ :) Спасибо также за фрагмент linq, принимая за 8 минут –

0

ли вы хотите этого?

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