3

私は次のことを書いていました

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があるのか​​ 疑問に思っていました.コンパイラ/インテルセンスは、内部の各アイテムthis.tabControl1.TabPagesが実際にはTabPage.

4

2 に答える 2

3

厳密に型指定されたオブジェクトを返す非ジェネリック インターフェイスを実装しない TabControl.TabPagesa を返すためです。TabPageCollectionIEnumerable<T>IEnumerable

したがって、型を指定すると、foreach暗黙的にキャストされます。タイプを指定しない場合、それはタイプでobjectあり、後でキャストする必要があります。

詳細については、C# 言語仕様、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"));
于 2013-10-02T09:22:31.957 に答える