2010-07-23 96 views
6

在調試F#應用程序時,我希望能夠從VS2010立即窗口調用F#方法,但似乎不起作用。問題似乎是F#方法實際上是FSharpFunc對象。我嘗試使用「Invoke」方法,但交互式窗口無法識別它。如何從VS2010立即窗口中調用F#函數

+0

我在MS Connect的幾天前提出了一個有關此建議:https://connect.microsoft.com/VisualStudio/feedback/details/574242/f-debugger-support – 2010-07-24 01:35:26

+0

這似乎只是一個問題,如果你有一個參數的函數。我可以直接從立即窗口調用帶有多個(curried)參數的函數,語法與C#相同# – 2010-07-26 18:13:55

回答

9

Visual Studio的F#集成不支持立即窗口(或手錶)中的F#表達式,所以唯一的選擇是編寫與F#使用的編譯後表示相對應的C#代碼。我試過這樣做,並且遇到了與您所描述的相同的問題 - Invoke方法似乎存在(在Reflector中),但Visual Studio不想直接調用它。我試着用下面的例子:

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

但是,還有其他方法可以調用該函數。在這種情況下,F#編譯器生成的實際代碼是對InvokeFast方法的調用。如果您鍵入以下到即時窗口,它的工作原理:

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

這似乎也可以調用使用從C#4.0 dynamic通常Invoke法(證明該方法實際上是存在的!):

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

只有當您添加對Microsoft.CSharp.dll的引用(並且使用代碼中某處定義的某種類型 - 例如作爲註釋 - 以使其被加載)時,它纔有效。

+0

好的,這有效! 我試過靜態InvokeFast,但我沒有意識到我需要強制加載Microsoft.CSharp。使用動態是非常聰明的;) – 2010-07-23 21:10:32

+0

只是澄清 - 「InvokeFast」方法應該沒有'Microsoft.CSharp.dll'(但可能需要做的事情,以便立即窗口加載'FSharp.Core.dll')。 C#庫僅用於'dynamic'。 – 2010-07-23 21:29:32

相關問題