2009-09-30 5 views
5

में ऑब्जेक्ट्स, पैरामीटर और रेफरी कीवर्ड जब किसी विधि का औपचारिक तर्क प्रकार 'ऑब्जेक्ट' होता है, तो वास्तविक तर्क के लिए, किसी ऑब्जेक्ट प्रकार के लिए विरासत के माध्यम से यह संभव है। एक बार विधि में वस्तु को अपेक्षित प्रकार के लिए डाला जा सकता है। सब ठीक है।सी #

"सबसे अच्छा अतिभारित विधि:

अगर, हालांकि, विधि के हस्ताक्षर 'वस्तु' का औपचारिक तर्क है, रेफरी कीवर्ड यानी methodName (संदर्भ वस्तु) का उपयोग कर, संकलक कि बताते हुए एक त्रुटि फेंकता 'ByRefTest.Program.changeMeByRef (संदर्भ वस्तु)' के लिए मैच में कुछ अमान्य तर्क "तर्क '1': 'रेफरी ByRefTest.Person' से 'रेफरी वस्तु' के लिए परिवर्तित नहीं कर सकते" है ।

या का उपयोग नहीं के बीच का अंतर वस्तुओं को पार करते समय रेफ केवर्ड का उपयोग करते हुए पैरामीटर को ए फ्राइडमैन के ब्लॉग http://crazorsharp.blogspot.com/2009/07/passing-objects-using-ref-keywordwait.html में बहुत अच्छी तरह से समझाया गया है, लेकिन कस्टम प्रकार को वास्तविक तर्क के रूप में पारित करना क्यों संभव नहीं है प्रकार 'ऑब्जेक्ट' का औपचारिक तर्क रेफरी कीवर्ड का उपयोग करता है?

एक उदाहरण के रूप:

class Program 
{ 
    static void Main(string[] args) 
    { 
     Person p = new Person(); 

     changeMe(p); // compiles 
     changeMeByRef(ref p); // throws error 

     object pObject = (object)p; 
     changeMeByRef(ref pObject); // compiles 
    } 


    public static void changeMeByRef(ref object obj) 
    { 
     Person p = (Person)obj; 
    } 

    public static void changeMe(object obj) 
    { 
     Person p = (Person)obj; 

    } 
} 

public class Person 
{ 
} 

धन्यवाद।

ps मैं बस करने के लिए हस्ताक्षर बदल दिया है:

public static void changeMeByRef < टी > (संदर्भ टी obj) जहां टी: व्यक्ति

इस changeMeByRef (रेफरी पी) के लिए संकलित;

+0

यह http://stackoverflow.com/questions/1207144/c-why-doesnt-ref-and-out-support-polymorphism/1207302#1207302 –

उत्तर

8

क्योंकि विधि तर्क के लिए उपयोग किए गए चर के प्रकार के उल्लंघन में पैरामीटर को विभिन्न प्रकार के मान के लिए बदल सकती है। सरल उदाहरण:

public void Foo(ref object x) 
{ 
    x = "hello"; 
} 

... 

// This doesn't compile, fortunately. 
Stream y = null; 
Foo(ref y); 

विधि में काम करने के बाद y का मूल्य क्या है? यह एक स्ट्रिंग होना चाहिए - लेकिन यह चर के प्रकार का उल्लंघन करता है। यह एक बहुत ही बुरी बात होगी, पूरी तरह से प्रकार की सुरक्षा का उल्लंघन करेगा। यह .NET 4.0 में भी IList<T> के सामान्य आविष्कार के लिए एक ही कारण है।

एरिक लिपर्ट recently blogged about the invariance of ref in more detail

2

क्योंकि रेफ पैरामीटर दोनों तरीकों से काम करता है। आप अपने फ़ंक्शन के अंदर एक मनमानी ऑब्जेक्ट को पैरामीटर असाइन कर सकते हैं, और कॉलिंग कोड को इसे संभालने की आवश्यकता है।

0

में बताते हैं यह करते हैं। यह आसान है।
परिवर्तन मेरे (पी); // संकलन
परिवर्तनMeByRef (रेफरी (ऑब्जेक्ट) पी); // इस बार यह त्रुटियों को फेंकना नहीं चाहिए।

+0

@behrooz का डुप्लिकेट है: क्या आपने इसे आजमाया था? आप एक रेफ तर्क नहीं डाल सकते हैं। –