2015-08-30 4 views
8

सबसे पहले "एक विधि समूह एक सदस्य लुकअप के परिणामस्वरूप ओवरलोडेड विधियों का एक सेट है"। मेरे उदाहरण में मैं 1 9 ओवरलोड के साथ Console.WriteLine विधियों के सेट का उपयोग करता हूं।'is' ऑपरेटर के बाएं किनारे पर विधियों को अनुमति क्यों दी जाती है और अभ्यास में इसका उपयोग कैसे किया जा सकता है?

सी # भाषा विशिष्टता में एक विधि समूह की परिभाषा में यह भी कहा गया है: "एक आवेदक-अभिव्यक्ति (§7.6.5), एक प्रतिनिधि-निर्माण-अभिव्यक्ति (§7.6.10.5) में एक विधि समूह की अनुमति है और ।

Action<string> print = (Action<string>)Console.WriteLine; 
print("Hello!"); 

if (Console.WriteLine is Action<string>) 
{ 
    Console.WriteLine("We're compatible!"); 
} 
: के रूप में एक के बायीं ओर ऑपरेटर
है, और परोक्ष एक संगत प्रतिनिधि प्रकार (§6.6) "में बदला जा सकता

मैं एक परिदृश्य में जहाँ इस कार्यक्षमता उपयोगी हो सकता है के बारे में सोच सकता है

पहली पंक्तियों से पता चलता है कि हम एक विधि समूह '12 'कर सकते हैंएक प्रतिनिधि में। वास्तव में क्या होता है "अंतर्निहित रूपांतरण एक संगत प्रतिनिधि प्रकार में परिवर्तित होता है", जो एक प्रतिनिधि का उदाहरण बनाता है जो संगत हस्ताक्षर वाले Console.WriteLine विधियों में से एक को ओवरलोड किया गया है।

तो चश्मा के अनुसार हम उपरोक्त वर्णित "बाईं ओर ऑपरेटर" सुविधा का उपयोग कर सकते हैं ताकि यह जांच सके कि विधि समूह किसी दिए गए प्रतिनिधि प्रकार (अंतर्निहित रूपांतरण मौजूद है) के साथ संगत है या नहीं। यह नमूना कोड में 'if' कथन के अंदर चेक किया गया है।

आश्चर्यजनक रूप से, कोड संकलित करता है, लेकिन चेतावनी देता है "दी गई अभिव्यक्ति कभी उपलब्ध नहीं है ('System.Action') प्रकार"। तो ऐसा लगता है कि विधि समूह की संगतता और रनटाइम पर प्रतिनिधि प्रकार की जांच करने का कोई प्रयास नहीं होगा।

इसलिए, मेरे सवालों का:

  • क्यों तरीकों समूहों के ऑपरेटर 'है' की जांच कार्यावधि में नहीं किया जा सकता है, तो बाईं ओर मौजूद अनुमति दी जाती है?
  • यह निर्माण चेतावनी क्यों देता है, संकलन त्रुटि नहीं?
  • क्या 'है' ऑपरेटर के बाईं ओर विधि समूहों का उपयोग करने के कोई व्यावहारिक परिदृश्य हैं?
  • क्या यह भविष्य के उपयोगों के लिए आरक्षित है, यानी यह अनुमान लगाया गया है कि ऊपर दिया गया कोड किसी दिन काम करेगा?
+1

@ एरिक लिपर्ट पहले से ही "द सी # प्रोग्रामिंग भाषा" पुस्तक में लिखा है: "यह एक विधि समूह 'है' ऑपरेटर के बाएं हाथ पर कानूनी है, भ्रामक सुविधा है। परिणाम 'है' मूल्यांकन हमेशा 'झूठा 'होगा, भले ही विधि समूह * दाएं हाथ के प्रकार के रूप में परिवर्तनीय है"। Https://books.google.co.il/books?id=s-IH_x6ytuQC&lpg=PT336&ots=ls909TgS6V&pg=PT336#v=onepage&q&f=false – haim770

उत्तर

1

विनिर्देश (4.0) को स्पष्ट रूप से इस विशेष मामले से जुड़ी जानकारी:

7.10.10 is ऑपरेटर

[...] आपरेशन E is T का परिणाम जहां E एक अभिव्यक्ति है और T एक प्रकार है, एक बूलियन मान है [...]

अभी तक, बहुत अच्छा है। विनिर्देश जारी है:

यदि E एक विधि समूह है [...] परिणाम गलत है।

इस जानकारी को देखते हुए, आइए आपके प्रश्न देखें।

यदि रनटाइम पर चेक नहीं किया जा सकता है तो 'is' ऑपरेटर के बाएं किनारे पर विधियों को अनुमति क्यों दी जाती है?

विनिर्देश इस ऑपरेशन के लिए अनुमति देता है। यह कैसे हुआ यह Lippert's answer on another question देखें।

यह निर्माण चेतावनी क्यों देता है और संकलन त्रुटि नहीं?

निर्माण वाक्य रचनात्मक रूप से मान्य है, भले ही यह हमेशा झूठे मूल्यांकन करता है। चेतावनी सिर्फ आपको यह बताने के लिए है कि आप कुछ अनजान कर रहे हैं।

क्या 'है' ऑपरेटर के बाईं ओर विधि समूहों का उपयोग करने के कोई व्यावहारिक परिदृश्य हैं?

शायद नहीं। हो सकता है कि अगर आपको object पारित किया गया हो जो एक विधि समूह हो या यह कुछ और हो सकता है तो यह उपयोगी हो सकता है। (यह स्वीकार्य रूप से एक समेकित उदाहरण है, जो कुछ गंभीरता से संदिग्ध प्रथाओं का प्रतिनिधित्व करता है।)

क्या यह भविष्य के उपयोगों के लिए आरक्षित है, यानी यह अनुमान लगाया गया है कि ऊपर दिया गया कोड किसी दिन काम करेगा?

सं Lippert से फिर से हवाला देते हुए "यह बनाने के लिए अचानक सच लौटने या कोई त्रुटि किया जा रहा शुरू 'एम डी है' एक तोड़ने परिवर्तन होगा।" [मूल में जोर]

+0

बिल्कुल सही देखें! इस मुद्दे पर एरिक लिपर्ट की टिप्पणी के लिंक के लिए धन्यवाद। अगर मैं इसे खुद पा सकता हूं तो मैं इस सवाल से नहीं पूछूंगा। –

संबंधित मुद्दे