Czasami widzę pytania na temat przypadków skrajnych i innych dziwności w przepełnieniu stosu, na które z łatwością odpowiadają Jona Skeeta i Erica Lipperta, wykazując głęboką znajomość języka i jego wielu zawiłości, takich jak ten:
Możesz pomyśleć, że aby użyć
foreachpętli, kolekcja, nad którą się iterujesz, musi zaimplementowaćIEnumerablelubIEnumerable<T>. Ale jak się okazuje, tak naprawdę nie jest to wymóg. Wymagane jest, aby typ kolekcji miał wywoływaną metodę publicznąGetEnumerator, i która musi zwracać jakiś typ, który ma wywoływany moduł pobierania właściwości publicznejCurrenti metodę publiczną,MoveNextktóra zwraca abool. Jeśli kompilator może stwierdzić, że wszystkie te wymagania są spełnione, generowany jest kod, aby użyć tych metod. Tylko jeśli te wymagania nie są spełnione, sprawdzamy, czy obiekt implementujeIEnumerablelubIEnumerable<T>.
To fajne rzeczy, które warto wiedzieć. Rozumiem, dlaczego Eric to wie; jest w zespole kompilatorów, więc musi wiedzieć. Ale co z tymi, którzy wykazują tak głęboką wiedzę, ale nie są poufnymi?
Jak zwykli śmiertelnicy (którzy nie należą do zespołu kompilatora C #) dowiadują się o takich rzeczach?
W szczególności, czy istnieją metody, których używają ci ludzie, aby systematycznie wykorzeniać taką wiedzę, eksplorować ją i internalizować (uczynić ją własną)?