在下面的虚拟代码中,如果我在最后一行设置了一个断点,那么在调试器中无法访问变量x
:
当前上下文中不存在名称x。
module main =
let x = 1
printfn "%d" x
1
但如果我将最后一行更改为1|>ignore
并在那里设置断点,我可以在调试器中看到x = 1
。 F在第一种情况下如何确定x
超出范围?感谢。
答案 0 :(得分:2)
在此上下文中,x
值被编译为main
模块的静态字段(表示为类)。
我认为如果输入Foo.main.x
(其中Foo
是文件的命名空间),您应该始终能够在监视窗口中看到它 - 如果您没有明确提供命名空间,这将是在这种情况下,从文件名生成,例如foo.fs
。
如果添加ignore
,为什么会看到该变量?我不完全确定 - 可能是因为F#编译器将断点设置到放置x
的同一个类中的某个位置(作为字段)。调试器完成的查找遵循C#(.NET)规则,因此它查看已编译的代码而不是F#源代码(因为F#集成不提供自己的解析器)。
通常,如果您在声明它们的函数内部,可以假设可以查看局部变量。通过使用this
(它提供对闭包对象的引用),通常可以访问闭包中的捕获变量,但这可能取决于某些编译器内部。