为什么一个对象没有在带有 var 的 foreach 中键入

本文关键字:foreach 一个对象 为什么 var | 更新日期: 2023-09-27 18:33:37

我在写以下内容

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,编译器/智能感知不应该弄清楚,因为this.tabControl1.TabPages中的每个项目实际上都是一个TabPage

为什么一个对象没有在带有 var 的 foreach 中键入

因为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;
    }
}