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

时间:2018-03-09 18:22:54

标签: 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!");
}

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

enter image description here

如果它不仅涵盖了编译时常量,而且还包括所有允许绑定,那么这将会在由于一个微不足道的错误引起的生产中遇到一个真正的错误,比如

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 }
    ...
}

有没有理由没有这个(除了“功能不是免费的”)?我觉得这应该是更多重要的功能第一语言,表达式往往没有副作用,而不是C#。

2 个答案:

答案 0 :(得分:6)

您可以通过warnon编译器选项为未使用的绑定启用警告。如果您想要严格,您甚至可以使用warnaserror+将其变为错误。

警告编号为1182,默认情况下处于关闭状态,如F#文档中compiler options page中所述。

fsc --warnaserror+:1182 --warnon:1182 Program.fs

如何执行此操作取决于您的编辑器。在Visual Studio中,您可以通过指定"其他标志"来实现此目的。和"将警告视为错误"在项目属性中。

答案 1 :(得分:1)

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

<PropertyGroup>
    <OtherFlags>$(OtherFlags) --warnon:1182</OtherFlags>
    <TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>

例如,请参见the project file of FSharp.Core itself.