为什么没有对未使用的let绑定发出警告?

Asi*_*sik 6 f#

C#警告编译时常量的未使用变量:

static void Main(string[] args)
{
    var unused = "hey"; //CS0219 The variable 'unused' is assigned but its value is never used
    Console.WriteLine("Hello World!");
}
Run Code Online (Sandbox Code Playgroud)

但是F#编译器没有,即使编辑器现在确实选择了它:

在此输入图像描述

如果它不仅涵盖了编译时常量,而且涵盖了所有允许绑定,那么就会发现由于一个微不足道的错误导致的生产中的真正错误,类似于

let callApiXyz connectionInfo = async {
    let fullUrl = sprintf "%s..." connectionInfo.Url
    ...
    let! result = httpGet connectionInfo // fail, didn't use the modified url
    // Should have been:
    // let! result = httpGet { connectionInfo with Url = fullUrl }
    ...
}
Run Code Online (Sandbox Code Playgroud)

有没有理由没有这个(除了"功能不是免费的")?我认为这应该在功能第一语言中重要,其中表达式往往没有副作用,而不是C#.

Arn*_*ion 9

对于我们这些没有 Visual Studio 并手动编辑 fsproj 的人来说,实现 Tomas 的答案的方法是

<PropertyGroup>
    <OtherFlags>$(OtherFlags) --warnon:1182</OtherFlags>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

自身的工程文件为例FSharp.Core


Tom*_*cek 7

您可以通过warnon编译器选项为未使用的绑定启用警告.如果你想要严格,你甚至可以warnaserror+用来把它变成一个错误.

警告编号为1182,默认情况下处于关闭状态,如F#文档中的编译器选项页面中所述.

fsc --warnaserror+:1182 --warnon:1182 Program.fs
Run Code Online (Sandbox Code Playgroud)

如何做到这一点取决于你的编辑.在Visual Studio中,可以通过在项目属性中指定"其他标志"和"将警告视为错误"来执行此操作.