2010-07-23 8 views
6

से एफ # फ़ंक्शन कैसे शुरू करूं, जबकि एक एफ # एप्लिकेशन डीबग करते समय, मैं वीएस -2010 तत्काल विंडो से एफ # विधि का आह्वान करने में सक्षम होना चाहता हूं लेकिन यह काम नहीं कर रहा है। समस्या यह प्रतीत होती है कि एफ # विधियां वास्तव में FSharpFunc ऑब्जेक्ट्स हैं। मैंने "Invoke" विधि का उपयोग करने का प्रयास किया लेकिन इंटरैक्टिव विंडो इसे पहचान नहीं पाती है।मैं वीएस -2010 तत्काल विंडो

+0

मैंने कुछ दिनों पहले इस बारे में एमएस कनेक्ट में एक सुझाव दायर किया: https://connect.microsoft.com/VisualStudio/feedback/details/574242/f-debugger-support –

+0

यह केवल एक समस्या है एक तर्क के साथ एक समारोह है। मैं सी # –

उत्तर

9

विजुअल स्टूडियो के लिए एफ # एकीकरण तत्काल विंडो (या घड़ियों) में एफ # अभिव्यक्तियों का समर्थन नहीं करता है, इसलिए एकमात्र विकल्प सी # कोड को संकलित प्रतिनिधित्व के अनुरूप सी # कोड लिखना है जो F # उपयोग करता है। मैंने ऐसा करने की कोशिश की और मुझे आपके जैसा वर्णित एक ही समस्या है - Invoke विधि वहां दिखाई दे रही है (प्रतिबिंबक में), लेकिन विजुअल स्टूडियो इसे सीधे कॉल नहीं करना चाहता है। मैंने निम्नलिखित उदाहरण का उपयोग करके इसे आजमाया:

let foo f = 
    let n = f 1 2 // Breakpoint here 
    n + 1 

हालांकि, फ़ंक्शन को कॉल करने के अन्य तरीके हैं। इस मामले में, एफ # कंपाइलर द्वारा उत्पन्न वास्तविक कोड InvokeFast विधि पर कॉल है। आप तत्काल खिड़की के लिए निम्न लिखते हैं, तो यह काम करता है:

Microsoft.FSharp.Core.FSharpFunc<int, int>.InvokeFast<int>(f, 1, 2) | 

यह भी प्रतीत होता है कि आप सी # 4.0 से dynamic का उपयोग कर सामान्य Invoke विधि कॉल कर सकते हैं (यह साबित करते है कि विधि वास्तव में है!):

((dynamic)f).Invoke(1, 2) 

यह केवल तभी काम करता है जब आप Microsoft.CSharp.dll (और आपके कोड में असेंबली में परिभाषित कुछ प्रकार का उपयोग करें - उदाहरण के लिए एक एनोटेशन - जैसे कि यह लोड हो जाता है)।

+0

ठीक उसी वाक्यविन्यास के साथ तत्काल विंडो से कई (करीबी) तर्कों के साथ एक फ़ंक्शन का आह्वान करने में सक्षम हूं, ठीक है, यह काम करता है! मैंने स्थिर InvokeFast की कोशिश की लेकिन मुझे एहसास नहीं हुआ कि मुझे माइक्रोसॉफ्ट के लोड को मजबूर करने की आवश्यकता है .CSharp। गतिशील का उपयोग करना बहुत चालाक है;) –

+0

बस स्पष्ट करने के लिए - 'InvokeFast' दृष्टिकोण को 'Microsoft.CSharp.dll' के बिना काम करना चाहिए (हालांकि शायद कुछ करने की आवश्यकता है ताकि तत्काल विंडो' FSharp.Core.dll' लोड हो)। सी # लाइब्रेरी केवल 'गतिशील' के लिए आवश्यक है। –