2010-07-23 29 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