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