Thỉnh thoảng tôi thấy các câu hỏi về các trường hợp cạnh và sự kỳ lạ khác trên Stack Overflow dễ dàng được trả lời bởi những người như Jon Skeet và Eric Lippert, thể hiện kiến thức sâu sắc về ngôn ngữ và nhiều điều phức tạp của nó, như thế này:
Bạn có thể nghĩ rằng để sử dụng một
foreach
vòng lặp, bộ sưu tập bạn đang lặp đi lặp lại phải thực hiệnIEnumerable
hoặcIEnumerable<T>
. Nhưng hóa ra, đó không thực sự là một yêu cầu. Điều bắt buộc là loại bộ sưu tập phải có một phương thức công khai được gọiGetEnumerator
và loại đó phải trả về một loại có bộ nhận tài sản công cộng được gọiCurrent
và phương thức công khaiMoveNext
trả về abool
. Nếu trình biên dịch có thể xác định rằng tất cả các yêu cầu đó được đáp ứng thì mã được tạo để sử dụng các phương thức đó. Chỉ khi những yêu cầu đó không được đáp ứng, chúng tôi mới kiểm tra xem đối tượng có thực hiệnIEnumerable
hay khôngIEnumerable<T>
.
Đó là điều tuyệt vời để biết. Tôi có thể hiểu tại sao Eric biết điều này; Anh ấy thuộc nhóm biên dịch, vì vậy anh ấy phải biết. Nhưng những gì về những người thể hiện kiến thức sâu sắc như vậy, những người không phải là người trong cuộc?
Làm thế nào để những người bình thường (những người không thuộc nhóm biên dịch C #) tìm hiểu về những thứ như thế này?
Cụ thể, có những phương pháp mà những người này sử dụng để tìm hiểu một cách có hệ thống những kiến thức như vậy, khám phá nó và tiếp thu nó (biến nó thành của riêng họ)?