कभी-कभी मैं स्टैक ओवरफ्लो पर किनारे के मामलों और अन्य विचित्रता के बारे में प्रश्न देखता हूं, जो कि जॉन स्कीट और एरिक लिपर्ट की पसंद के अनुसार आसानी से उत्तर दिया जाता है , इस तरह की भाषा और इसकी कई जटिलताओं का गहन ज्ञान प्रदर्शित करता है:
आप सोच सकते हैं कि
foreach
लूप का उपयोग करने के लिए , जिस संग्रह पर आप अधिक ध्यान दे रहे हैं, उसे लागू करना चाहिएIEnumerable
याIEnumerable<T>
। लेकिन जैसा कि यह पता चला है, यह वास्तव में एक आवश्यकता नहीं है। यह आवश्यक है कि संग्रह के प्रकार के पास एक सार्वजनिक विधि होनी चाहिए जिसे कहा जाता हैGetEnumerator
, और उसे कुछ प्रकार को वापस करना होगा जिसमें एक सार्वजनिक संपत्ति प्राप्तकर्ता कहा जाता हैCurrent
और एक सार्वजनिक विधि हैMoveNext
जो एक रिटर्न देती हैbool
। यदि कंपाइलर यह निर्धारित कर सकता है कि उन सभी आवश्यकताओं को पूरा किया गया है तो उन तरीकों का उपयोग करने के लिए कोड उत्पन्न होता है। केवल अगर वे आवश्यकताएं पूरी नहीं होती हैं, तो हम यह देखने के लिए जांच करते हैं कि क्या वस्तु लागू होती हैIEnumerable
या नहींIEnumerable<T>
।
यह जानने के लिए अच्छा सामान है। मैं समझ सकता हूं कि एरिक यह क्यों जानता है; वह संकलक टीम पर है, इसलिए उसे जानना होगा। लेकिन उन लोगों के बारे में जो ऐसे गहन ज्ञान का प्रदर्शन करते हैं जो अंदरूनी नहीं हैं?
केवल इस तरह के सामान के बारे में पता लगाने के लिए केवल नश्वर (जो सी # संकलक टीम पर नहीं हैं) कैसे करते हैं?
विशेष रूप से, क्या ऐसे तरीके हैं जो इन लोगों को इस तरह के ज्ञान को व्यवस्थित रूप से जड़ने के लिए उपयोग करते हैं, इसे तलाशते हैं और इसे आंतरिक करते हैं (इसे अपना बनाते हैं)?