次のようなコードで
List<int> foo = new List<int>() { 1, 2, 3, 4, 5, 6 };
IEnumerable<int> bar = foo.Where(x => x % 2 == 1);
bar
System.Linq.Enumerable.WhereListIterator<int>
遅延実行によるタイプです。実装しているため、 usingIEnumerable<int>
に変換することができます。ただし、が呼び出されたときに実行されるコードの一部を特定できませんでした。私は dotPeek を逆コンパイラとして使用していますが、このようなことを試みるのはこれが初めてです。途中で間違いを犯した場合は修正してください。List<int>
ToList()
ToList()
これまでに見つけたことを以下に説明します (すべてのアセンブリはバージョン 4.0.0.0 です)。
Enumerable.WhereArrayIterator<TSource>
アセンブリ内Enumerable.cs
の名前空間のファイルに実装されています。クラスはそれ自体を定義することも、実装することもありません。同じファイルにあるものを実装します。実装します。System.Linq
System.Core
ToList()
IEnumerable<TSource>
Enumerable.Iterator<TSource>
Enumerable.Iterator<TSource>
IEnumerable<TSource>
ToList()
にもある拡張メソッドですEnumerable.cs
。それが行うのは、null チェックと、List<TSource>
その引数でのコンストラクターの呼び出しだけです。List<T>
アセンブリ内List.cs
の名前空間のファイルで定義されています。によって呼び出されるコンストラクターには、シグネチャがあります。もう一度 null チェックを行い、引数を にキャストします。コレクションに要素がない場合は、空の配列の新しいリストが作成されます。それ以外の場合は、メソッドを使用して新しいリストが作成されます。System.Collections.Generic
mscorlib
ToList()
public List(IEnumerable<T> collection)
ICollection<T>
ICollection.CopyTo()
ICollection<T>
はmscorlib
\System.Collections.Generic
\で定義されICollection.cs
ます。IEnumerable
汎用および非汎用の形式で実装されます。
これは私が立ち往生しているところです。どちらEnumerable.WhereArrayIterator<TSource>
もEnumerable.Iterator<TSource>
実装しないため、どこかでキャストを行う必要があり、が呼び出されたICollection
ときに実行されるコードを見つけることができません。CopyTo()