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ć
foreach
pętli, kolekcja, nad którą się iterujesz, musi zaimplementowaćIEnumerable
lubIEnumerable<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 publicznejCurrent
i metodę publiczną,MoveNext
któ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 implementujeIEnumerable
lubIEnumerable<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ą)?