Іноді я бачу запитання щодо крайових випадків та інших дивацтв на Stack Overflow, на які легко відповідати, як подібні Джон Скіт та Ерік Ліпперт, демонструючи глибокі знання мови та її багатьох тонкощів, як ця:
Ви можете подумати, що для використання
foreach
циклу колекція, яку ви повторюєте, повинна реалізуватиIEnumerable
абоIEnumerable<T>
. Але, як виявляється, це насправді не є вимогою. Потрібно, щоб тип колекції мав публічний метод, який називаєтьсяGetEnumerator
, і він повинен повертати певний тип, який має виклик публічної власностіCurrent
та публічний метод,MoveNext
який повертає abool
. Якщо компілятор може визначити, що всі ці вимоги виконуються, код формується для використання цих методів. Тільки якщо ці вимоги не виконані, ми перевіряємо, чи реалізується об'єктIEnumerable
чиIEnumerable<T>
.
Це класні речі, щоб знати. Я можу зрозуміти, чому Ерік це знає; він в команді компілятора, тому він повинен знати. Але як бути з тими, хто демонструє такі глибокі знання, хто не є інсайдерами?
Як просто смертні (які не входять до команди компілятора C #) дізнаються про подібні речі?
Зокрема, чи існують методи, які ці люди використовують для того, щоб систематично викорінювати такі знання, досліджувати їх та інтерналізувати (робити їх своїми)?