我正在撰写以下内容
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不应该将其计算为{{1}内的每个项目实际上是this.tabControl1.TabPages
?
答案 0 :(得分:3)
因为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"));
答案 1 :(得分:0)
你想要这个吗?
foreach (TabPage t in tabControl1.TabPages)
{
foreach (Control c in t.Controls)
{
string a = c.Name;
}
}