我正在写以下内容
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"));