F# 变量脱离上下文

mat*_*ser 5 f#

在以下虚拟代码中,如果我在最后一行设置断点,x则无法在调试器中访问该变量:

名称 x 在当前上下文中不存在。

module main = 
    let x = 1
    printfn "%d" x
    1
Run Code Online (Sandbox Code Playgroud)

但是如果我将最后一行更改为1|>ignore并在那里设置断点,我可以x = 1在调试器中看到。在第一种情况下,F 如何确定x超出范围?谢谢。

Tom*_*cek 3

在这种情况下,该x值被编译为模块的静态字段main(表示为类)。

Foo.main.x我认为如果您输入(Foo文件的命名空间在哪里 - 如果您没有显式提供命名空间,则这将从文件名生成,例如在本例中) ,您应该始终能够在监视窗口中看到它foo.fs

为什么添加后会看到变量ignore?我不完全确定 - 这可能是因为 F# 编译器将断点设置到x放置的同一类中的某个位置(作为字段)。调试器完成的查找遵循 C# (.NET) 规则,因此它查看已编译的代码,而不是 F# 源代码(因为 F# 集成不提供自己的解析器)。

一般来说,如果您位于声明局部变量的函数内部,则可以假设可以查看局部变量。闭包中捕获的变量通常可以使用this(它为您提供对闭包对象的引用)进行访问,但这可能取决于某些编译器内部结构。