2017-02-22 8 views
9

मैं दो अलग मशीनों पर निम्नलिखित कार्यक्रम चला रहा हूँ:स्थैतिक वर्ग में बेनामी विधि गैर स्थैतिक है? इसे कैसे शुरू करें?

static class Program 
{ 
    static void Main(string[] args) 
    { 
     Func<int> lambda =() => 5; 
     Console.WriteLine(lambda.GetMethodInfo().IsStatic); 
     Console.ReadLine(); 
    }   
} 

एक मशीन पर, .NET 4.5 और विजुअल स्टूडियो 2012 के साथ स्थापित इस "सही" प्रिंट, एक और एक पर, .नेट फ्रेमवर्क 4.6.2 के साथ और विजुअल स्टूडियो 2015 यह "झूठा" प्रिंट करता है।

मैंने सोचा कि अज्ञात विधियां स्थिर हैं यदि उन्हें स्थिर संदर्भ में परिभाषित किया गया है। पिछले कुछ फ्रेमवर्क अपडेट के दौरान क्या यह परिवर्तन (दस्तावेजी तरीके से) था?

मुझे क्या करना है, Expression.Calllambda.GetMethodInfo() पर उपयोग करना है, और गैर स्थैतिक मामले में इसके लिए एक उदाहरण की आवश्यकता है जिस पर लैम्ब्डा परिभाषित किया गया है। अगर मैं lambda.GetMethodInfo().Invoke का उपयोग करना चाहता था तो मुझे एक ही समस्या का सामना करना पड़ेगा।

मुझे ऐसा उदाहरण कैसे प्राप्त हो सकता है?

+0

लेकिन आपका लक्ष्य क्या है? अपेक्षित परिणाम क्या है? –

उत्तर

9

ध्यान रखें कि यह (लैम्बडास) एक कंपाइलर सुविधा है इसलिए रनटाइम फ्रेमवर्क संस्करण कोई फर्क नहीं पड़ता। इसके अलावा, क्योंकि यह एक कंपाइलर सुविधा है, यह आश्चर्य की बात नहीं है कि 2012 और 2015 के बीच कोई अंतर है (जब रोज़लिन को पेश किया गया था जो मौजूदा कंपाइलर बुनियादी ढांचे में से अधिकांश को प्रतिस्थापित करता है)।

मैं क्यों यह है विशेष रूप से यहाँ बदल दिया गया होगा के लिए एक ठोस कारण नहीं दे सकता है (हालांकि मैं कई बदलाव पता करने के लिए किए गए थे सक्षम अधिक संदर्भों में काम करने के लिए संपादित करें और जारी रखें), लेकिन यह संविदात्मक के बारे में कभी नहीं रहा कैसे lambdas लागू कर रहे हैं।

मुझे ऐसा उदाहरण कैसे प्राप्त हो सकता है?

खैर, lambda एक Delegate है, और कहा कि हमेशा एक Target संपत्ति एक उदाहरण का संदर्भ जो जब प्रतिनिधि इसलिए बाध्य है उजागर कर रहा है।

+0

यही वह है, धन्यवाद। आपके उत्तर के आधार पर मुझे Roslyn github में कुछ दस्तावेज मिले। यह एक प्रदर्शन सुधार प्रतीत होता है: https://roslyn.codeplex.com/workitem/246 – Jens

0

मैं कैसे इस तरह के एक उदाहरण प्राप्त कर सकते हैं

मुझे यकीन है कि यह मायने रखता है नहीं कर रहा हूँ? निश्चित रूप से आप बस (उदाहरण के लिए) ऐसा करने से लैम्ब्डा समारोह चला सकते हैं

Console.Print(lambda());

तो तथ्य यह है कि यह स्थिर है या नहीं काफी हद तक मायने नहीं रखती है।

+0

मुझे 'Expression.Call' का उपयोग करने की आवश्यकता है, मैं बस इसे बस कॉल नहीं कर सकता। – Jens

+0

@ जेन्स मेला पर्याप्त है – SpaceUser7448

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