C # कंपाइलर के लिए आवश्यक है कि जब भी कोई कस्टम प्रकार ऑपरेटर को परिभाषित करे ==
, तो उसे भी परिभाषित किया जाना चाहिए !=
( यहाँ देखें )।
क्यों?
मैं यह जानने के लिए उत्सुक हूं कि डिजाइनरों ने इसे आवश्यक क्यों समझा और संचालक दोनों में से किसी एक के लिए उचित कार्यान्वयन के लिए संकलक डिफ़ॉल्ट क्यों नहीं कर सकता है जब केवल अन्य मौजूद हैं। उदाहरण के लिए, लुआ आपको केवल समानता ऑपरेटर को परिभाषित करने देता है और आपको दूसरे को मुफ्त में मिलता है। C # आपको या तो == या दोनों == और! = को परिभाषित करने के लिए कहकर ऐसा ही कर सकता है और फिर स्वचालित रूप से अनुपस्थित! = ऑपरेटर को संकलित कर सकता है !(left == right)
।
मैं समझता हूं कि अजीब कोने के मामले हैं जहां कुछ इकाइयां न तो समान और न ही असमान हो सकती हैं, (जैसे IEEE-754 NaN की), लेकिन वे अपवाद जैसे लगते हैं, नियम नहीं। इसलिए यह स्पष्ट नहीं करता है कि C # कंपाइलर डिजाइनरों ने अपवाद को नियम क्यों बनाया।
मैंने खराब कारीगरी के मामलों को देखा है जहां समानता ऑपरेटर को परिभाषित किया गया है, फिर असमानता ऑपरेटर प्रत्येक और हर तुलना के साथ एक कॉपी-पेस्ट है और हर && एक पर स्विच किया जाता है || (आपको बिंदु मिलता है ... मूल रूप से! (a = b) डी मॉर्गन के नियमों के माध्यम से विस्तार किया गया)। यह खराब अभ्यास है कि संकलक डिजाइन द्वारा समाप्त कर सकता है, जैसा कि लूआ के साथ होता है।
नोट: एक ही ऑपरेटरों के लिए रखती है <> <=> =। मैं उन मामलों की कल्पना नहीं कर सकता जहाँ आपको अप्राकृतिक तरीकों से परिभाषित करने की आवश्यकता होगी। Lua आपको केवल <और <= परिभाषित करता है और => और> स्वाभाविक रूप से फॉर्मर्स की उपेक्षा के माध्यम से परिभाषित करता है। C # समान (कम से कम 'डिफ़ॉल्ट रूप से) क्यों नहीं करता है?
संपादित करें
जाहिर तौर पर वैध कारण हैं कि वे प्रोग्रामर को समानता और असमानता के लिए चेक लागू कर सकते हैं। कुछ उत्तर उन मामलों की ओर इशारा करते हैं जहां यह अच्छा हो सकता है।
हालाँकि, मेरे प्रश्न का कर्नेल, यह क्यों C # में जबरन आवश्यक है जब आमतौर पर यह तार्किक रूप से आवश्यक नहीं होता है?
यह .NET इंटरफेस जैसे डिज़ाइन विकल्पों के विपरीत भी हड़ताली है Object.Equals
, IEquatable.Equals
IEqualityComparer.Equals
जहां NotEquals
समकक्ष की कमी से पता चलता है कि रूपरेखा !Equals()
वस्तुओं को असमान मानती है और वह है। इसके अलावा, जैसी कक्षाएं Dictionary
और विधियाँ .Contains()
विशेष रूप से पूर्वोक्त इंटरफेस पर निर्भर करती हैं और परिभाषित होने पर भी सीधे ऑपरेटरों का उपयोग नहीं करती हैं। वास्तव में, जब ReSharper समानता सदस्यों को उत्पन्न करता है, तो यह दोनों को परिभाषित करता है ==
और !=
इसके संदर्भ में Equals()
भी और तब भी जब उपयोगकर्ता सभी को ऑपरेट करने के लिए चुनता है। वस्तु समानता को समझने के लिए फ्रेमवर्क द्वारा समानता ऑपरेटरों की आवश्यकता नहीं होती है।
असल में, .NET फ्रेमवर्क इन ऑपरेटरों की परवाह नहीं करता है, यह केवल कुछ Equals
तरीकों की परवाह करता है । उपयोगकर्ता द्वारा अग्रानुक्रम में परिभाषित किए जाने वाले = = और! = दोनों संचालकों की आवश्यकता का निर्णय विशुद्ध रूप से भाषा के डिजाइन से संबंधित है और वस्तु शब्दार्थों का नहीं जहां तक .NET का संबंध है।