2017-08-29 30 views
8

मैं नई सी # 7 सुविधाओं के साथ प्रयोग कर रहा था और मुझे कुछ अजीब मिला।आंतरिक विधि विधि सी # 7 में पैरा को स्वीकार करती है तो क्यों रेफ रिटर्न रिटर्न करना संभव नहीं है?

public struct Command 
{ 
} 

public class CommandBuffer 
{ 
    private Command[] commands = new Command[1024]; 
    private int count; 

    public ref Command GetNextCommand() 
    { 
     return ref commands[count++]; 
    } 

    public ref Command GetNextCommand(out int index) 
    { 
     index = count++; 
     return ref commands[index]; 
    } 
} 

public class BufferWrapper 
{ 
    private CommandBuffer cb = new CommandBuffer(); 

    // this compiles fine 
    public ref Command CreateCommand() 
    { 
     ref Command cmd = ref cb.GetNextCommand(); 
     return ref cmd; 
    } 

    // doesn't compile 
    public ref Command CreateCommandWithIndex() 
    { 
     ref Command cmd = ref cb.GetNextCommand(out int index); 
     return ref cmd; 
    } 
} 

क्यों दूसरी विधि मेरा पीछा संकलक त्रुटि देता है: निम्नलिखित सरलीकृत परिदृश्य को देखते हुए?

CS8157 Cannot return 'cmd' by reference because it was initialized to a value that cannot be returned by reference 

मैं जानता हूँ कि संकलक आप एक वर कि लग सकती है पर बाद में मृत किया जा रहा करने के लिए एक रेफरी वापस जाने के लिए अनुमति नहीं दे सकते, लेकिन मैं वास्तव में नहीं दिख रहा है कि कैसे बाहर परम एक अतिरिक्त होने से किसी में इस परिदृश्य में परिवर्तन मार्ग।

+8

यह है "पॉइंटर एलियासिंग" नामक एक सामान्य संकलक समस्या। सी या सी ++ कंपाइलर में ऑप्टिमाइज़र को हल करने की समस्या को हल करना चाहिए और फ़्लब करना होगा। मूल मुद्दा यह है कि 'आउट' तर्क एक अवलोकन दुष्प्रभाव की अनुमति देता है जो संदर्भ को अमान्य कर सकता है। यह बताते हुए कि जैसे असाइनमेंट को cmd को अमान्य नहीं किया जाता है, करना बहुत मुश्किल है। और वास्तव में, cmd अब संदर्भ कमांड [अनुक्रमणिका] नहीं करता है। आप इस मामले में "कोई समस्या नहीं" कहेंगे, सी # कंपाइलर कहता है "इतना सुनिश्चित नहीं है, चलो नहीं"। अन्यथा बुनियादी कारणों से क्यों फोरट्रान अभी भी प्रासंगिक है और इसे जोड़ने के लिए लंबे समय तक क्यों लगा। –

+1

गोचा। इसलिए मूल रूप से ऐसे परिदृश्य होते हैं जहां आउट पैरामीटर बाद में संदर्भ को अमान्य कर सकता है ताकि संकलक इन सभी विधियों को विश्लेषण करने की कोशिश करने के बजाय अवैध बना देता है क्योंकि यह वास्तव में एक विश्वसनीय प्रक्रिया नहीं है। – loodakrawa

उत्तर

0

आप कॉल नहीं कर सकते रेफरी वापसी विधि रेफरी या बाहर परम

इस परिवर्तन यह

public ref Command CreateCommandWithIndex(out int index) 
     { 
      ref Command cmd = ref cb.GetNextCommand(out index); 
      return ref cmd; 
     } 

तो ठीक किया जा सकता है जब आप इस विधि का मूल्य द्वारा इसे कहते फोन है कि

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

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