アイテム配列をラップするクラスを実装しています。LINQの使用を容易にするために、クラスにIEnumerable<T>
インターフェイスを実装する必要があります。
クラスを実装する最初の「素朴な」試みは次のとおりです。
public class Foo<T> : IEnumerable<T>
{
private readonly T[] _items;
public Foo(T[] items) { _items = items; }
public IEnumerator<T> GetEnumerator() { return _items.GetEnumerator(); } // ERROR
IEnumerator IEnumerable.GetEnumerator() { return GetEnumerator(); }
}
ただし、配列はIEnumerable
インターフェイスのみを実装し、 を実装しないため、これはコンパイルされませんIEnumerable<T>
。コンパイルエラーは次のとおりです。
タイプ 'System.Collections.IEnumerator' を 'System.Collections.Generic.IEnumerator<T>' に暗黙的に変換することはできません。明示的な変換が存在します (キャストがありませんか?)
この問題を克服するために、配列を継承するインターフェイスにローカルでキャストします。IEnumerable<T>
たとえば、次のようになりますIList<T>
。
public IEnumerator<T> GetEnumerator() {
return ((IList<T>)_items).GetEnumerator();
}
これは正常にコンパイルされ、最初のテストでも、クラスが列挙可能なコレクションとして正しく機能することが示されました。
ただし、キャスティングのアプローチは完全に満足できるものではありません。このアプローチに関する注意事項はありますか? より信頼性の高い (タイプセーフな) 方法で問題を解決できますか?