抑制F#编译器警告:可能的错误缩进:此标记超出了上下文

时间:2015-05-15 23:37:52

标签: unit-testing f# compiler-warnings readability xunit

我有一些xunit测试我想布局如下以便于阅读:

[<Fact>] let ``Has Hash Code 2``()          = target.GetHashCode().ShouldBe 2
[<Fact>] let ``ToString yields two``()      = target.ToString().ShouldBe "two"
[<Fact>] let ``Has underlysing type int``() = target.GetUnderlyingType().ShouldBe typeof<int>

我在let语句上收到编译器警告:&#34;可能的错误缩进:此标记超出了从位置%s开始的上下文。尝试进一步缩进此标记或使用标准格式约定。&#34;

我尝试了#nowarn "lexfltTokenIsOffsideOfContextStartedEarlier",但这只是生成了另一个编译器警告&#34;无效的警告编号&#34;。

https://github.com/fsharp/fsharp/blob/057dbf77df7355321c3c18137c2d552bdfa1272b/src/fsharp/FSComp.txt

中没有为此错误列出警告编号

有没有办法抑制此警告?

2 个答案:

答案 0 :(得分:6)

我为一种风格回答道歉,“你不需要它”,但似乎是这种情况。此外,这个问题显然成为那些在F#编写单元测试的人的FAQ。另一个案例是[<Literal>]的。

无论如何,在项目甚至文件级别禁用警告似乎是一个坏主意,除非你有充分的理由这样做。

据我所知,你希望这些陈述是单行的(例如,[<Fact>]没有占据整行)。在VS2013中有两种方法可以实现这一点:

  1. 将该属性放在let

    let [<Fact>] ``Has Hash Code 2``()          = target.GetHashCode().ShouldBe 2
    
  2. 声明后写一个双分号:

    [<Fact>] let ``Has Hash Code 2``()          = target.GetHashCode().ShouldBe 2;;
    

答案 1 :(得分:5)

试试这个:

#nowarn "0058"

要找出正确的警告号是什么,只需在命令行中构建东西(或在VS中然后转到View - &gt; Output - &gt; Build),它会告诉你。这就是我所看到的:

Program.fs(7,3): warning FS0058: Possible incorrect indentation: this token is offside of context started at position (5:25). Try indenting this token further or using standard formatting conventions.