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
foreachciclo, la collezione su cui stai iterando debba implementareIEnumerableoIEnumerable<T>. Ma a quanto pare, questo non è in realtà un requisito. Ciò che è richiesto è che il tipo di raccolta deve avere un metodo pubblico chiamatoGetEnumeratore che deve restituire un tipo con un getter di proprietà pubblica chiamatoCurrente un metodo pubblicoMoveNextche 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 implementaIEnumerableoIEnumerable<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)?