在一段代码中
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>
由于延迟执行而属于类型。由于它实现IEnumerable<int>
了可以将其转换为List<int>
using ToList()
。但是,我无法识别ToList()
调用时运行的代码的某些部分。我正在使用 dotPeek 作为反编译器,这是我第一次尝试这样的事情,所以如果我在途中犯了任何错误,请纠正我。
我将在下面描述我到目前为止发现的内容(所有程序集都是版本 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
. 它所做的只是空检查,然后List<TSource>
用它的参数调用构造函数。List<T>
在程序集中List.cs
命名空间的文件中定义。被调用的构造函数具有签名。它再次进行空检查,然后将参数转换为. 如果集合没有元素,则创建一个空数组的新列表,否则使用该方法创建新列表。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()
调用时运行的代码。