为什么一个对象没有用var强制键入foreach?
我写的是以下内容
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
?
因为TabControl.TabPages
返回一个TabPageCollection
,它不实现强类型的IEnumerable
而是返回一个返回对象的非通用IEnumerable
接口。
因此,如果您提供foreach
的类型,它将被隐含地呈现。 如果您不提供类型,则其类型为object
,您需要稍后再进行转换。
阅读C#语言规范,8.8.4了解更多信息。
您还可以使用Linq扩展方法Enumerable.Cast
:
foreach (var item in this.tabControl1.TabPages.Cast()) { // item is TabPage }
这很方便,特别是如果你想使用Linq:
var tabs = this.tabControl1.TabPages.Cast() .Where(tp => tp.Name.StartsWith("MyTabPage"));
你想要这个吗?
foreach (TabPage t in tabControl1.TabPages) { foreach (Control c in t.Controls) { string a = c.Name; } }