Occasionalmente vedo domande su casi limite e altre stranezze su Stack Overflow a cui è facile rispondere da artisti del calibro di Jon Skeet ed Eric Lippert, dimostrando una profonda conoscenza della lingua e delle sue molte complessità, come questa:
Potresti pensare che per usare un
foreach
ciclo, la collezione su cui stai iterando debba implementareIEnumerable
oIEnumerable<T>
. Ma a quanto pare, questo non è in realtà un requisito. Ciò che è richiesto è che il tipo di raccolta deve avere un metodo pubblico chiamatoGetEnumerator
e che deve restituire un tipo con un getter di proprietà pubblica chiamatoCurrent
e un metodo pubblicoMoveNext
che restituisce abool
. Se il compilatore può determinare che tutti questi requisiti sono soddisfatti, il codice viene generato per utilizzare tali metodi. Solo se tali requisiti non sono soddisfatti verifichiamo se l'oggetto implementaIEnumerable
oIEnumerable<T>
.
È roba interessante da sapere. Posso capire perché Eric lo sappia; fa parte del team del compilatore, quindi deve saperlo. Ma che dire di quelli che dimostrano una conoscenza così profonda che non sono addetti ai lavori?
In che modo i semplici mortali (che non fanno parte del team di compilatori C #) scoprono cose come questa?
In particolare, ci sono metodi che queste persone usano per sradicare sistematicamente tali conoscenze, esplorarle e interiorizzarle (renderle proprie)?