2012-03-28 24 views
8

नीचे दिए गए कोड में मुझे विधि MdrResponseInterpreterstatic घोषित करना होगा अन्यथा मेरे पास संकलन त्रुटि है।क्यों प्रतिनिधि स्थिर होना चाहिए?

class.... { 

    private StandardBuilder _mdrResponseBuilder = 
     new StandardBuilder(MdrResponseInterpreter); 

    public static bool MdrResponseInterpreter(DNMessageDeliverer builder, 
               DNFieldSet message) 
    { 
     // .... work 
    } 

क्यों? मैं उम्मीद करते हैं कि MdrResponseInterpreter क्योंकि क्षेत्र initializers this/उदाहरण के सदस्यों के लिए पहुँच नहीं है this

उत्तर

11

उपयोग करने में सक्षम होना चाहिए _mdrResponseBuilder स्थिर नहीं है। यदि आप इंस्टेंस सदस्यों तक पहुंच चाहते हैं तो प्रारंभकर्ता को प्रारंभकर्ता को ले जाएं।

कल्पना का कहना है:

एक उदाहरण क्षेत्र के लिए एक चर प्रारंभकर्ता संदर्भ नहीं दे सकता उदाहरण बनाया जा रहा है। इस प्रकार, यह एक संकलन समय त्रुटि एक चर प्रारंभकर्ता

में this संदर्भ के लिए अपने कोड को स्पष्ट रूप से संदर्भित नहीं करती जबकि this है, रूपांतरण को सौंपने के लिए विधि समूह का संदर्भ है this परोक्ष अगर विधि एक उदाहरण सदस्य है।

1

आपको प्रारंभकर्ताओं में इंस्टेंस सदस्यों का उपयोग करने की अनुमति नहीं है।

एक प्रतिनिधि के बारे में सोचें 1) एक ऑब्जेक्ट संदर्भ और 2) एक विधि संदर्भ। चूंकि आप this तक नहीं पहुंच सकते हैं, ऑब्जेक्ट संदर्भ सेट करने का कोई तरीका नहीं है, इसलिए प्रतिनिधि के रूप में विधि का उपयोग करने में सक्षम होने का एकमात्र तरीका इसे static के रूप में घोषित करना है (क्योंकि एक प्रतिनिधि का ऑब्जेक्ट संदर्भ null स्थिर तरीकों के लिए है)। कन्स्ट्रक्टर को अपना प्रारंभिक स्थानांतरित करने से आप इसे पाने में मदद कर सकते हैं।

+1

निश्चित रूप से * उस बिंदु पर एक वस्तु है (अन्यथा मूल्य कहां दिया जा रहा है?) लेकिन आपको अभी तक 'इस' तक पहुंचने की अनुमति नहीं है। –

+0

निश्चित रूप से, मैं अस्पष्ट था। मेरा जवाब अपडेट किया गया। – Botz3000

+0

मैं अभी भी कहूंगा कि यह अस्पष्ट है। वस्तु * पूरी तरह से मौजूद है। यह पूरी तरह से * प्रारंभिक * नहीं हो सकता है, लेकिन यह भी निर्माता शरीर में सच है। (अन्य व्युत्पन्न कन्स्ट्रक्टर निकाय भी हो सकते हैं जो अभी तक चलने के लिए नहीं हैं ...) –

1

विधि को स्थैतिक होना चाहिए क्योंकि इसे ऑब्जेक्ट प्रारंभ करने पर लागू किया गया है, इससे पहले कि कन्स्ट्रक्टर ने निष्पादन शुरू कर दिया हो। यदि आप this तक पहुंच बनाना चाहते हैं, तो अपने कन्स्ट्रक्टर के अंदर से प्रारंभिक विधि को कॉल करें।

5

CodeInChaos के जवाब में जोड़ने के लिए (जो सही है) तुम सिर्फ निर्माता के लिए काम स्थानांतरित कर सकते हैं:

private StandartBuilder _mdrResponsBuilder; 

public Foo() // Whatever your type is called 
{ 
    // Simpler syntax for creating a delegate, too. Just use a 
    // method group conversion... 
    _mdrResponsBuilder = MdrResponseInterpreter; 
} 

संपादित करें: मान लिया गया है इसके बाद के संस्करण कि StandartBuilder एक प्रतिनिधि प्रकार है। यदि यह एक निर्माता को एक प्रतिनिधि प्रकार स्वीकार कर रहा है, तो आपको new StandartBuilder(MdrResponseInterpreter) पर वापस जाना होगा, लेकिन फिर भी इसे कन्स्ट्रक्टर में रखना होगा।

+0

@Downvoter: टिप्पणी करने की देखभाल? –

+0

बस सोच रहा है, यह कैसे है कि "_mdrResponsBuilder = MdrResponseInterpreter" सही है? प्रश्न में कुछ भी इंगित करता है कि मानकबिल्डर एक प्रतिनिधि नहीं है ... यह एक वर्ग हो सकता है जो एक फंक को अपने कन्स्ट्रक्टर में स्वीकार कर रहा हो? बीटीडब्ल्यू, मैंने – odalet

+1

@odalet को कम नहीं किया: हाँ, यह संभव है। मुझे लगता है कि यह अधिक संभावना है (प्रश्न शीर्षक दिया गया है) कि यह एक प्रतिनिधि प्रकार है। स्पष्ट करने के लिए संपादित करेंगे। –