在调试F#应用程序时,我希望能够从VS2010的立即窗口中调用F#方法,但似乎无法正常工作。问题似乎是F#方法实际上是FSharpFunc对象。我尝试使用“Invoke”方法,但交互式窗口无法识别它。
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.dll
的情况下工作(尽管可能需要做一些事情,以便立即窗口加载 FSharp.Core.dll
)。C# 库仅用于 dynamic
。 - Tomas Petricek