有时,我会看到有关堆栈溢出的边缘情况和其他怪异的问题,这些问题很容易被Jon Skeet和Eric Lippert之类的人回答,这显示出对该语言及其许多复杂性 的深入了解,例如:
您可能会认为,要使用
foreach
循环,要迭代的集合必须实现IEnumerable
或IEnumerable<T>
。但是事实证明,这实际上不是必需的。所要求的是,集合的类型必须具有称为的公共方法GetEnumerator
,并且必须返回具有称为的公共属性getterCurrent
和MoveNext
返回a 的公共方法的某种类型bool
。如果编译器可以确定满足所有这些要求,则将生成代码以使用那些方法。仅当不满足这些要求时,我们才会检查对象是否实现IEnumerable
或IEnumerable<T>
。
这是很酷的事情。我能理解为什么埃里克知道这一点。他在编译器团队中,所以他必须知道。但是那些表现出如此深厚的知识而不是内部人的人呢?
凡人(不是C#编译器团队成员)如何找到类似这样的东西?
具体来说,这些人是否使用方法来系统地扎根此类知识,对其进行探索并对其进行内部化(使其自己拥有)?