2010-06-22 16 views
5
public class x : y 
{  

public Func<user, bool> SendStuffAction = SendStuff; 

//overridden from y 
public override bool SendStuff(user u) 
{ 
    //do stuff 
} 

} 

उपरोक्त कोड लेना, जहां SendStuff एक स्थानीय ओवरराइड उदाहरण विधि है, मुझे एक संदर्भ त्रुटि मिलती है जो SendStuff स्थिर नहीं है। क्या प्रतिनिधि एक ही कक्षा के अंदर से एक उदाहरण विधि को इंगित नहीं कर सकता है जिस पर विधि SendStuff विधि मौजूद है?उदाहरण विधि के साथ Func का उपयोग

त्रुटि है: एक गैर स्थिर संदर्भ

क्या होगा अगर विधि निजी है, यही कारण है कि इससे काम नहीं होता में स्थिर विधि का उपयोग नहीं कर सकते हैं।

private Func<user, bool> SendStuffAction = SendStuff; 
+1

अधिक कोड पोस्ट करें। यह टुकड़ा ठीक दिखता है – Andrey

+1

क्या कोई यह समझा सकता है कि SendStuffAction को स्थिर क्यों माना जाता है? – SWeko

+1

यदि आप फ़ील्ड प्रारंभकर्ता के रूप में एक विधि का उपयोग करते हैं, तो यह हमेशा एक स्थिर विधि होना चाहिए। फ़ील्ड शुरू होने से पहले आवृत्ति को एक स्थिर स्थिति में गारंटी देने का कोई तरीका नहीं है, इसलिए उदाहरण विधियों की अनुमति नहीं है। – Toby

उत्तर

7

हाँ, यह कर सकता है ... लेकिन, यदि आप स्थैतिक घोषित नहीं करते हैं तो आपको इसे निर्माता में सेट करने की आवश्यकता है।

class MyClass 
{ 
    public Func<loan, user, bool> SendStuffAction ; 

    MyClass() 
    { 
     SendStuffAction = SendStuff; 
    } 

    bool SendStuff(loan loanVar, user userVar) 
    { 
     return true; 
    } 
} 
+0

धन्यवाद लेकिन क्या आप थोड़ा और समझ सकते हैं कि यह क्यों है? –

+0

[+1 दिलचस्प, इसे एहसास नहीं हुआ] [http://stackoverflow.com/questions/923343/c-error-class-delegate-field-initializer-cannot-reference-the-non-static)। जैसा कि टोबी ने उपरोक्त मुख्य प्रश्नों की टिप्पणियों में उल्लेख किया है, एक क्षेत्र प्रारंभिक में एक गैर स्थैतिक सदस्य का उपयोग करके इसे कहीं और इस्तेमाल करने के लिए खुलता है जबकि उदाहरण का निर्माण एक अज्ञात स्थिति में होता है (प्रारंभिक आदेश अज्ञात क्रम में निष्पादित होते हैं)। आपको इसे कन्स्ट्रक्टर में करने की अनुमति है, क्योंकि फ़ील्ड प्रारंभकर्ता समाप्त हो गए हैं और आपके पास किसी भी शेष प्रारंभिकरण के क्रम पर नियंत्रण है, हालांकि आपको अभी भी सावधान रहना होगा। – shambulator

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