Ocasionalmente, vejo perguntas sobre casos extremos e outras estranhezas no Stack Overflow que são facilmente respondidas por nomes como Jon Skeet e Eric Lippert, demonstrando um profundo conhecimento da linguagem e seus muitos meandros, como este:
Você pode pensar que, para usar um
foreach
loop, a coleção sobre a qual você está iterando deve implementarIEnumerable
ouIEnumerable<T>
. Mas, como se vê, isso não é realmente um requisito. O que é necessário é que o tipo da coleção tenha um método público chamadoGetEnumerator
e que retorne algum tipo que tenha um getter de propriedade pública chamadoCurrent
e um método públicoMoveNext
que retorne abool
. Se o compilador puder determinar que todos esses requisitos sejam atendidos, o código será gerado para usar esses métodos. Somente se esses requisitos não forem atendidos, verificamos se o objeto implementaIEnumerable
ouIEnumerable<T>
.
Isso é legal de se saber. Eu posso entender por que Eric sabe disso; ele está na equipe do compilador, então ele tem que saber. Mas e aqueles que demonstram um conhecimento tão profundo que não são privilegiados?
Como meros mortais (que não fazem parte da equipe do compilador C #) descobrem coisas como essa?
Especificamente, existem métodos que essas pessoas usam para erradicar sistematicamente esse conhecimento, explorá-lo e internalizá-lo (torná-lo seu)?