2013-10-02 4 views
3

난 다음var를 사용하여 foreach에 개체를 stongly 형식으로 입력하지 않는 이유는 무엇입니까?

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입니까?

답변

3

TabControl.TabPages은 강력한 형식의 IEnumerable<T>을 구현하지 않지만 개체를 ​​반환하는 비 일반 IEnumerable 인터페이스를 구현하는 TabPageCollection을 반환하기 때문에.

따라서 형식을 foreach에 입력하면 암시 적으로 형변환됩니다. 유형을 제공하지 않으면 유형은 object이며 나중에 형변환해야합니다.

자세한 내용은 C# language spec, 8.8.4을 참조하십시오. 그것은 당신이 Linq에를 사용하려는 경우 특히 편리합니다

foreach (var item in this.tabControl1.TabPages.Cast<TabPage>()) 
{ 
    // item is TabPage 
} 

:

var tabs = this.tabControl1.TabPages.Cast<TabPage>() 
    .Where(tp => tp.Name.StartsWith("MyTabPage")); 
+1

나는 도움이 될만한 답변을 기대하지 않았습니다 :) linq 발췌 문장에 대해 감사 드리며 8 분 내에 수락합니다. –

0

당신이에 원하는 마십시오

또한 Linq를 확장 방법 Enumerable.Cast를 사용할 수 있을까?