Почему объект не набирается строго в 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?

2 ответа

Решение

Так как 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"));

Вы хотите к этому?

foreach (TabPage t in tabControl1.TabPages)
{
    foreach (Control c in t.Controls)
    {
        string a = c.Name;
    }
}
Другие вопросы по тегам