4

を実装する別のクラスを拡張するクラスでこれを実行しようとしていますIEnumerable<T>:

public override IEnumerator<T> GetEnumerator(){
    foreach (var item in base){
        // Some logic here
        yield return item;
        // Some more logic here
    }
}

ただし、これは、「ベース」が正しく使用されていないことを示すコンパイル エラーで失敗します。

列挙されたコレクションにいくつかの「仮想」アイテムを挿入し、他のいくつかのアイテムをスキップすることを除いて、親クラスのすべての動作を継承したいと考えています。

列挙子を手動で操作することでこれを回避しました(基本的に、の代わりにonforeachを呼び出す以外に展開することを行います)。しかし、これは正確に最も単純なコードにはなりません。GetEnumeratorbasethis

私の質問は次のとおりです。これは foreach で実行できますか?

4

1 に答える 1

3

いいえ、foreach ではできません。

とC# のアクセスには大きな違いがthisあります。baseキーワードを使用するthisと、値として分類されます (値の型は、使用が発生するクラスのインスタンス型です)。ただし、baseキーワードが値として扱われることはありません。これは、現在のクラスの同様の名前のメンバーによって隠されている基底クラスのメンバーにアクセスするために使用されるbase-access式の一部である可能性があります。

   base.identifier 
   base[argument-list]

したがって、baseキーワードを介して、基本クラスのメンバーにのみアクセスできます。しかし、それは基本型の値として扱われず、値が使用される式 (キャスト、foreach ステートメントなど) の一部にすることはできません。

そして、あなたが望むことをするための唯一の有効なアプローチは、基本クラスのメンバーにアクセスすることです:

public override IEnumerator<T> GetEnumerator()
{
    IEnumerator<T> enumerator = base.GetEnumerator();
    while (enumerator.MoveNext())
    {
        T item = enumerator.Current;
        // Some logic here
        yield return item;
        // Some more logic here
    }
}
于 2012-04-24T11:20:45.470 に答える