2013-05-04 4 views
14

यह किसी भी विशेष समस्या को हल करने के लिए नहीं है। बस एक कंपाइलर सवाल।क्यों शून्य == झूठी सी # में संकलन त्रुटि का परिणाम नहीं है?

निम्नलिखित कोड का संकलन त्रुटि क्यों नहीं होता है? यह संदर्भ प्रकार की तुलना प्राचीन प्रकार से कर रहा है। तुलनात्मक करने के लिए संकलक के लिए शून्य और झूठी दोनों को कुछ अर्थ में व्याख्या करना होगा। या पार्सर बस इस तरह के पैटर्न के लिए स्कैनिंग है और इसे झूठी से बदल दिया है?

if(null == false) { } 
+4

मूल्य प्रकार या नहीं, 'झूठी' अभी भी एक वस्तु है। यह तुलना के लिए शायद बॉक्स किया जाएगा। – cHao

+6

@cHao: आपका अनुमान गलत है। समानता ऑपरेटर विशेष रूप से मुक्केबाजी से बचने के लिए डिज़ाइन किया गया है; विवरण के लिए विनिर्देश पढ़ें। –

उत्तर

28

यह कानूनी है क्योंकि उठाए गए तुलना ऑपरेटर का उपयोग किया जाता है। यदि आप bool से null पर तुलना करते हैं, तो bool और null दोनों को Nullable<bool> में परिवर्तित कर दिया गया है और Nullable<bool> के लिए तुलना ऑपरेटर का उपयोग समाप्त हो रहा है। आपको चेतावनी मिलती है क्योंकि जाहिर है, यह हमेशा झूठा होता है।

+4

मुझे आपके उत्तर को बेहतर पसंद है, क्योंकि यह बताता है कि _why_ की अनुमति है और _how_ यह काम करता है। बस स्पष्ट बताते हुए। वैसे, कंपाइलर (ऑप्टिमाइज़ेशन के साथ डीबग-मोड में) इसे छोड़ने की भी कोशिश नहीं करता है। यह कोड में 'झूठी' उत्सर्जित करता है। – Virtlink

+0

यह गलत है, spec (समानता ऑपरेटरों और शून्य) के प्रति खंड 7.9.10। यह स्पष्टीकरण केवल उस मामले में लागू होता है, जहां 'शून्य == x', 'x' एक शून्य प्रकार है। Spec का कहना है कि यह 'x.HasValue' के बराबर है। चूंकि शाब्दिक 'झूठा' एक शून्य प्रकार नहीं है, इसलिए यह कानूनी है क्योंकि उठाए गए तुलना ऑपरेटर से संबंधित नहीं है। – drf

+4

'झूठा' एक नामुमकिन प्रकार नहीं हो सकता है, लेकिन यह 'बूल' प्रकार का है और 'बूल' और' बूल 'के बीच एक अंतर्निहित रूपांतरण है? –

12

भाषा विनिर्देश की धारा 7.10.6 (संदर्भ प्रकार समानता ऑपरेटरों) में कहा गया:

x == null निर्माण भले ही टी एक मान प्रकार का प्रतिनिधित्व कर सकता है की अनुमति दी है, और परिणाम बस जब गलत परिभाषित किया गया है टी एक मूल्य प्रकार है।

यह प्रावधान की आवश्यकता है कि null == falsefalse, और नहीं एक संकलक त्रुटि हो।

+2

spec का यह अनुभाग केवल पैरामीटर पर लागू होता है। –

15

तेजस का उत्तर सही है। अधिक विशेष रूप से अपने कुछ बिंदुओं को संबोधित करने के लिए:

निम्नलिखित कोड का संकलन त्रुटि क्यों नहीं होता है?

प्रश्न उत्तरदायी नहीं है; यह कोई त्रुटि उत्पन्न नहीं करता है क्योंकि यह कानूनी कोड है, लेकिन यह एक ट्यूटोलॉजी है।

यदि आपका प्रश्न वास्तव में "सी # विनिर्देश का कौन सा अनुभाग इस कानूनी बनाता है?", तो यह एक उत्तरदायी प्रश्न है। उठाए गए समानता ऑपरेटरों पर अनुभाग कानूनी बनाता है।

यह एक संदर्भ प्रकार की तुलना प्राचीन प्रकार से कर रहा है।

यह नहीं है। सबसे पहले, "आदिम प्रकार" शब्द से बचें; विनिर्देश स्पष्ट रूप से इसे परिभाषित नहीं करता है और यह सी # में एक उपयोगी अवधारणा नहीं है। आप कहना चाहते थे कि मुझे लगता है कि यह संदर्भ प्रकार के मान की तुलना मूल्य प्रकार के मान से कर रहा है।

दूसरा, यह भी सही नहीं है। शून्य शब्दशः संदर्भ प्रकार या मान प्रकार का नहीं है; यह किसी प्रकार का नहीं है। यह परिवर्तनीय किसी भी शून्य मूल्य या किसी संदर्भ प्रकार के लिए है, लेकिन यह केवल अपने आप से नहीं है।

इस मामले में शून्य अक्षर को शून्य के बूल प्रकार में परिवर्तित कर दिया जाता है।

दोनों बातिल और झूठी तुलना करने के लिए संकलक के लिए कुछ में व्याख्या की जा करने के लिए है।

सही। उन्हें नालीदार बूल के रूप में व्याख्या किया जाता है।

पार्सर बस इस तरह के पैटर्न के लिए स्कैनिंग है और इसे झूठी जगह से बदल रहा है?

नहीं, लेकिन यह एक उत्कृष्ट अनुमान है। कंपाइलर निरंतर-गुना होगा, true == falsefalse पर, लेकिन यह फोल्डिंग अनुकूलन नहीं करता है जिसमें शून्य मूल्य प्रकार शामिल होते हैं। नामुमकिन मूल्य प्रकार संचालन के साथ संचालन पर निरंतर फोल्डिंग का समर्थन करने के लिए भाषा को फिर से डिजाइन किया जा सकता है; संस्करण संस्करण में प्रतिकूल रूप से मूल्यवान मूल्य प्रकार थे, प्रस्तावित सुविधा संभवतः समर्थित होगी।

+0

सीधे रिकॉर्ड सेट करने के लिए धन्यवाद। – weilin8

+0

तुलना भी तुलनात्मक रूप से C# में मान्य है? –

+0

@AndersForsgren: क्या * क्या * तुलना मान्य है, सी # के संस्करण में? –

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