如何在VS2010即时窗口中调用F#函数

7
在调试F#应用程序时,我希望能够从VS2010的立即窗口中调用F#方法,但似乎无法正常工作。问题似乎是F#方法实际上是FSharpFunc对象。我尝试使用“Invoke”方法,但交互式窗口无法识别它。

我几天前在MS Connect上提交了一个建议:https://connect.microsoft.com/VisualStudio/feedback/details/574242/f-debugger-support - Mauricio Scheffer
只有当您拥有一个带有单个参数的函数时,才会出现这个问题。我能够使用与C#相同的语法直接从立即窗口调用具有多个(柯里化)参数的函数。 - Maurice Flanagan
1个回答

10

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方法(证明该方法确实存在!):

<code>((dynamic)f).Invoke(1, 2)
</code>

只有在添加对 Microsoft.CSharp.dll 的引用后,此方法才能正常运行(并且在代码中使用该程序集中定义的某个类型 - 例如作为注释 - 以便它被加载)。


好的,这个可行!我尝试了静态调用InvokeFast,但我没有意识到我需要强制加载Microsoft.CSharp。使用dynamic是相当聪明的 ;) - Maurice Flanagan
只是为了澄清 - InvokeFast 方法应该可以在没有 Microsoft.CSharp.dll 的情况下工作(尽管可能需要做一些事情,以便立即窗口加载 FSharp.Core.dll)。C# 库仅用于 dynamic - Tomas Petricek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接