#if - #else - #endif 破坏 F# 脚本

#if - #else - #endif breaking F# Script

使用 F# v4.0 中的 Visual Studio 2015 更新 3 和 fsi.exe 我正在尝试 运行 这个脚本:

//error.fsx

#if INTERACTIVE
    let msg = "Interactive"
#else
    let msg = "Not Interactive"
#endif

let add x y =
    x + y

printfn "%d" (add 1 2)

输出: error.fsx(12,15):错误 FS0039:未定义值或构造函数 'add'

如果我然后注释掉 #if-#else-#endif 块,它工作正常:

// fixed.fsx

//#if INTERACTIVE
//    let msg = "Interactive"
//#else
//    let msg = "Not Interactive"
//#endif

let add x y =
    x + y

printfn "%d" (add 1 2)

输出: 3

我确定我做错了什么(而不是这是一个错误)但我一辈子都想不出如何让它工作。

想法?

这是let msg的缩进造成的。以下工作正常:

#if INTERACTIVE
let msg = "Interactive"
#else
let msg = "Not Interactive"
#endif

let add x y =
    x + y

printfn "%d" (add 1 2)

我不得不说,我不完全确定为什么代码会给出您提到的错误消息 - 我怀疑这是错误报告中的错误,值得 reporting it to the F# team。至少,应该有一个合理的错误信息!

貌似有了缩进,F#解析器实际解析代码如下:

let msg = "Interactive"
let add x y =
  x + y 
    printfn "%d" (add 1 2)

let msg 之前的间距导致编译器将 printfn 也视为缩进。如果您使用工具提示在编辑器中查看 y 变量的类型,您可以看到是这种情况...