为什么不用var在foreach中键入对象?

我正在写以下内容

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,编译器/ intellasense难道不应该弄清楚它是因为this.tabControl1.TabPages内部的每个项目实际上都是TabPage吗?

解决方法:

因为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"));
上一篇:C#-在Windows窗体中显示插入数据的异常


下一篇:C#-需要帮助修复Snake游戏中的错误