2010-07-12 9 views
27

मैं सी # भाषा के कुछ डिज़ाइन विकल्पों में रूचि रखता हूं। सी # कल्पना में एक नियम है कि is ऑपरेटर की अभिव्यक्ति के रूप विधि समूहों का उपयोग करने की अनुमति देता है:सी # भाषा डिजाइन: `is` ऑपरेटर के अंदर विधि समूह

class Foo { 
    static void Main() { if (Main is Foo) Main(); } 
} 

स्थिति से ऊपर हमेशा गलत है, के रूप में विनिर्देश का कहना है:

7.10.10 ऑपरेटर

है ई एक विधि समूह या अशक्त शाब्दिक है, की अगर ई के प्रकार के लिए एक संदर्भ प्रकार या एक नल प्रकार और ई का मूल्य है शून्य है, नतीजा झूठा है।

मेरे सवालों का: उद्देश्य/बिंदु/is की तरह इस तरह के "क्रम" ऑपरेटर अंदर विधि समूहों की तरह CLR में कोई क्रम प्रतिनिधित्व के साथ सी # भाषा तत्व का उपयोग करने के लिए अनुमति देने का क्या कारण है?

+2

+1 _no सुराग _... – SLaks

+0

यह ... आश्चर्यजनक है। 'As' ऑपरेटर पर अनुभाग विधि समूहों का कोई उल्लेख नहीं करता है। –

+0

@ टिम: लेकिन "एएस" ऑपरेटर को कास्ट्स, सशर्त ऑपरेटर और "है" ऑपरेटर के संयोजन के लिए एक वाक्य रचनात्मक चीनी के रूप में परिभाषित किया गया है, इसलिए "as" ऑपरेटर को विधि समूहों का उल्लेख करने की आवश्यकता नहीं है। –

उत्तर

21

सी # भाषा तत्व का उपयोग करने की अनुमति देने का उद्देश्य/बिंदु/कारण क्या है, जैसे कि "रनटाइम" ऑपरेटर के अंदर विधि समूहों जैसे सीएलआर में कोई रनटाइम प्रतिनिधित्व नहीं है?

भाषा डिज़ाइन नोट्स संग्रह इस निर्णय के बारे में कोई जिक्र नहीं करता है, इसलिए उत्तर में कोई अनुमान अनुमानित होगा। वे उल्लेख करते हैं कि यदि "है" का नतीजा हमेशा सत्य या गलत होने के लिए निर्धारित किया जा सकता है, तो यह इतना निर्धारित और चेतावनी उत्पन्न करता है। ऐसा लगता है कि यह बस एक त्रुटि हो सकती है।

एक चेतावनी में सही त्रुटि (या बस इसे अनुमति देने) को बदलने में सबसे आम कारण यह है कि इससे स्वचालित रूप से कोड उत्पन्न करने वाले प्रोग्राम के उत्पादकों पर बोझ कम हो जाता है। हालांकि, मुझे यहां वास्तव में एक आकर्षक परिदृश्य नहीं दिख रहा है।

अद्यतन:

मैं सिर्फ सी # 1.0 विनिर्देश जाँच की। इसमें इस भाषा नहीं है। यह नल या विधि समूह तर्कों के बारे में कुछ भी नहीं कहता है। और निश्चित रूप से यह विधि समूह रूपांतरणों के बारे में कुछ भी नहीं कहता है क्योंकि सी # 1.0 में कोई अंतर्निहित विधि समूह रूपांतरण नहीं था; यदि आप विधि एम को 0 डी 3

पर निर्दिष्ट करने के लिए विधि एम को रूपांतरित करना चाहते हैं तो यह बाद बिंदु "एम डी डी" के लिए सही है बल्कि सत्य के बजाय झूठ लौटने का औचित्य है; आप कानूनी तौर पर "डी डी = एम;" नहीं कह सकते तो "एम डी डी" सच क्यों होना चाहिए?

निश्चित रूप से सी # 2.0 में यह कम समझ में आता है, क्योंकि आप कह सकते हैं "डी डी = एम;" सी # 2.0 में।

मैंने अभी भी उन लोगों में से एक से पूछा है जब "है" ऑपरेटर डिज़ाइन किया गया था और उन्हें इस प्रश्न को किसी अन्य तरीके से तय करने की कोई याद नहीं थी। उनका संदेह यह था कि "है" ऑपरेटर का मूल डिज़ाइन किसी भी त्रुटि, केवल चेतावनियां नहीं देना था, और यह कि पाठ समूह और नल और व्हाट्नॉट के साथ क्या करना है, इस बारे में कल्पना में सभी पाठ पोस्ट-हॉक के लिए जोड़े गए थे Spec का सी # 2.0 संस्करण, और वास्तव में संकलक वास्तव में क्या किया के आधार पर।

संक्षेप में, ऐसा लगता है कि यह सी # 1.0 में एक डिज़ाइन छेद था जिसे सी # 2.0 के लिए spec अद्यतन किया गया था जब पर ppered था। ऐसा लगता है कि इस विशिष्ट व्यवहार की वांछित और जानबूझकर लागू नहीं किया गया था।

इस सिद्धांत को इस तथ्य से मजबूर किया गया है कि अज्ञात विधियों सी # 2.0 में "है" के तर्क के रूप में उपयोग की जाने वाली त्रुटि उत्पन्न करते हैं। ऐसा करने में यह एक तोड़ने वाला बदलाव नहीं होगा, लेकिन यह "एम डी डी" बनाने के लिए एक तोड़ने वाला परिवर्तन अचानक सच हो रहा है या त्रुटि हो रही है।

आगे अद्यतन:

हालांकि यह जांच कर रहा कुछ दिलचस्प सीखा है। (मेरे लिए।) जब सुविधा मूल रूप से डिज़ाइन की गई थी, तो डिजाइन को किसी प्रकार के नाम, या टाइप ऑब्जेक्ट को "है" के दाएं हाथ के तर्क के रूप में अनुमति देना था। सी # 1.0 को भेजे जाने से पहले उस विचार को छोड़ दिया गया था।

3

सब एक विधि सबसे पहले एक प्रकार की नहीं है, MSDN स्पष्ट रूप से निम्नलिखित:

कि क्या एक वस्तु के रन-टाइम प्रकार एक दिया प्रकार के साथ संगत है ऑपरेटर is जाँच करने के लिए प्रयोग किया जाता है

उदाहरण

public static void Test (object o) 
{ 
    Class1 a; 

    if (o is Class1) {} 
} 

From MSDN:

एक अभिव्यक्ति है सही का आकलन करता है, तो निम्न स्थितियों के दोनों मिले हैं:

  • अभिव्यक्ति अशक्त नहीं है।
  • अभिव्यक्ति को टाइप करने के लिए डाला जा सकता है। यही है, फॉर्म (प्रकार) (अभिव्यक्ति) की एक कास्ट अभिव्यक्ति अपवाद फेंकने के बिना पूरी हो जाएगी। अधिक जानकारी के लिए, 7.6.6 कास्ट एक्सप्रेशन देखें।

तो दूसरे उदाहरण पर आपके उदाहरण के लिए झूठी भूमि होने का कारण, इसे किसी विशिष्ट प्रकार के लिए जा सकता है।

मुझे उम्मीद है कि मैंने इस सवाल को गलत नहीं किया है।

+1

सवाल यह है कि 'मुख्य कक्षा 1' एक कंपाइलर त्रुटि क्यों नहीं है? – SLaks

+0

@SLacks: शायद हमें इसकी जांच करने के लिए परावर्तक का उपयोग करना चाहिए। – Andreas

+0

@SLaks, ReShaper का उपयोग करके मुझे इस संदेश के साथ चेतावनी मिलती है: "दी गई अभिव्यक्ति कभी एक प्रकार प्रदान नहीं की जाती है"। अब परावर्तक के साथ जांच कर रहा है .. –