5

क्या यह एक सीएलआर प्रतिबंध या भाषा डिजाइन निर्णय है? मैं सी में यह करने की कोशिश की ++/CLI, ज़ाहिर है, जहां यह काम करता है क्योंकि देशी C++ समर्थन करने के लिए जरूरत की:संदर्भ द्वारा पास के साथ सी # समर्थन ऑपरेटर ओवरलोडिंग क्यों नहीं करता है?

public ref class Test 
    { 
     public: 
     static Test^ operator &(Test^ msg, int& i) 
     { 
      i = i + 1; 

      return nullptr; 
     } 
    }; 

और फिर संकलक छोड़े गए उत्पादन को देखा:

public: static Test __gc* op_BitwiseAnd(Test __gc* msg, Int32 __gc** modopt(IsImplicitlyDereferenced __gc*) i) 
{ 
    i[0] += 1; 
    return 0; 
} 

मैं आगे चला गया और सी # परियोजना से इस ऑपरेटर कॉल करने की कोशिश - और निश्चित रूप से मैं [असुरक्षित] यह करने के लिए (मैं जरूरत सूचक) जाने के लिए की जरूरत:

Test t = new Test(); 
int i = 0; 

unsafe 
{ 
    t = t & &i; 
} 

जाहिर नहीं इतनी मेहनत CLR के लिए लागू करने के लिए? मैं वास्तव में ऑपरेटर ओवरलोडिंग में संदर्भ से गुजरता हूं और कम से कम खुद को प्रकाश में रखना चाहता हूं कि यह क्यों गुम है?

हमारे ऑपरेटर ओवरलोड में संदर्भ चर के साथ निपटने की आवश्यकता होने पर सी # असुरक्षित और पॉइंटर्स के पीछे कुरूपता क्यों नहीं छिपा सकता है? यहां तक ​​कि अगर मैंने इस बदसूरत कामकाज के साथ जाना चुना है, तो यह सिल्वरलाइट में काम नहीं करेगा, जहां असुरक्षित संचालन की अनुमति नहीं है ...

उत्तर

5

सी # में, आपके चर को कभी भी संदर्भों के रूप में स्पष्ट रूप से पास किए बिना कैलीज़ द्वारा कभी नहीं बदला जाता है (उदाहरण के लिए int.TryParse(s, out i) जहां आप स्पष्ट रूप से out कीवर्ड निर्दिष्ट करते हैं)। यह सुविधा ओवरलोडेड ऑपरेटर को आपकी स्पष्ट अनुमति के बिना ऑपरेटरों की सामग्री को बदलने की अनुमति देकर जटिल बनाती है।

उदाहरण के लिए

,

public static MyStruct operator + (ref MyStruct left, ref MyStruct right) { 
    left = new MyStruct(); // !!!!!!!! 
    return something(left, right); 
} 

आप सी # में इस तरह के एक ऑपरेटर संदर्भ जब:

MyStruct x = new MyStruct(); 
MyStruct y = new MyStruct(); 
MyStruct z = x + y; // in C#, you never expect `x` to be changed. 
+0

बिलकुल नहीं। रेफ पैरामीटर लेने के लिए बस ऑपरेटर ओवरलोडिंग करें? –

+0

इवान: फिर आप ओवरलोडेड ऑपरेटर को कैसे कॉल करेंगे? यदि कोई विधि 'रेफरी पैरामीटर' लेती है, तो कॉल साइट ** और ** परिभाषा साइट ** स्पष्ट रूप से ** पैरामीटर को 'रेफरी' घोषित करनी चाहिए। –

+0

मेहदाद: यह बिल्कुल ठीक है। उनके पास अलग-अलग हस्ताक्षर हैं, इसलिए बिना रेफरी के कॉलिंग कभी भी एक रिफॉर्म अधिभार से मेल नहीं खाती। इसके बारे में इतना जटिल क्या है, जिसने सी # टीम को इसे लागू नहीं किया? क्या होगा यदि मुझे वास्तव में एक ऑपरेंड को बदलने की आवश्यकता है जो एक संदर्भ प्रकार नहीं है - मैं इसे कैसे कर सकता हूं? –

1

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

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