在一段代码中
List<int> foo = new List<int>() { 1, 2, 3, 4, 5, 6 };
IEnumerable<int> bar = foo.Where(x => x % 2 == 1);
barSystem.Linq.Enumerable.WhereListIterator<int>由于延迟执行而属于类型。由于它实现IEnumerable<int>了可以将其转换为List<int>using ToList()。但是,我无法识别ToList()调用时运行的代码的某些部分。我正在使用 dotPeek 作为反编译器,这是我第一次尝试这样的事情,所以如果我在途中犯了任何错误,请纠正我。
我将在下面描述我到目前为止发现的内容(所有程序集都是版本 4.0.0.0):
Enumerable.WhereArrayIterator<TSource>在程序集中Enumerable.cs命名空间的文件中实现。该类既不定义自身也不实现。它实现了位于同一文件中的内容。确实执行。System.LinqSystem.CoreToList()IEnumerable<TSource>Enumerable.Iterator<TSource>Enumerable.Iterator<TSource>IEnumerable<TSource>ToList()是一个扩展方法,也位于Enumerable.cs. 它所做的只是空检查,然后List<TSource>用它的参数调用构造函数。List<T>在程序集中List.cs命名空间的文件中定义。被调用的构造函数具有签名。它再次进行空检查,然后将参数转换为. 如果集合没有元素,则创建一个空数组的新列表,否则使用该方法创建新列表。System.Collections.GenericmscorlibToList()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()调用时运行的代码。