F# 如何抑制模式匹配不完整时的编译器警告

F# 如何抑制模式匹配不完整时的编译器警告,f#,pattern-matching,F#,Pattern Matching,好吧,好吧-我知道这通常是个坏主意。尽管如此,在一个非常特定的上下文中——在我的测试用例中,我只期望某个结果,而其他任何东西都将以任何方式成为错误。而进行模式匹配只会模糊我的测试代码 这里有一个例子 type Result = | Success of int * int | Error of String let someFunc x : Result = // implementation not important here // and then later in

好吧,好吧-我知道这通常是个坏主意。尽管如此,在一个非常特定的上下文中——在我的测试用例中,我只期望某个结果,而其他任何东西都将以任何方式成为错误。而进行模式匹配只会模糊我的测试代码

这里有一个例子

type Result =
     | Success of int * int
     | Error of String

let someFunc x : Result = // implementation not important here

// and then later in my test code

[<Test>]
member me.``Some Cool Test Method``() =
    let (Success x, y) = someFunc "Foo"
    equals x 1
    equals y 2
类型结果=
|int*int的成功
|字符串错误
让someFunc x:Result=//实现在这里不重要
//然后在我的测试代码中
[]
请原谅我。‘一些很酷的测试方法’`()=
let(Success x,y)=someFunc“Foo”
等于x1
等于y2

关于如何使其更令人愉快和更友好的编译器,您有什么想法吗?

您可以通过在未完成模式匹配之前的某个位置插入这一行来禁用警告:

#nowarn "0025"
我以前也用它进行过一些快速测试,很可能是您描述的场景

另一个选项可能是您通过进行模式匹配来引用的选项,它是使用通配符
\uu
捕获所有其他情况,并抛出一个错误:

[<Test>]
member me.``Some Cool Test Method``() =
    match someFunc "Foo" with
    | (Success x, y) ->
        equals x 1
        equals y 2
    | _ -> failwith "unexpected value"
[]
请原谅我。‘一些很酷的测试方法’`()=
将someFunc“Foo”与
|(成功x,y)->
等于x1
等于y2
|带有“意外值”的故障

然后编译器会很高兴,如果你知道它永远不会到达那里,你就不想进一步处理这个错误,因为你知道它永远不会被抛出。

为什么不这样编写测试呢

[<Test>]
member me.``Some Cool Test Method``() =
    let actual = someFunc "Foo"

    let expected = Success(1, 2)
    equals expected actual
[]
请原谅我。‘一些很酷的测试方法’`()=
让实际值=someFunc“Foo”
让期望值=成功(1,2)
等于预期实际值

这不会生成任何需要抑制的警告。

您应该能够使用
--nowarn:YY
来获得正确的号码#nowarn标志肯定会有所帮助。用匹配项包围它正是我不想要的,因为它隐藏了我测试代码的意图。投票支持#nowarn部分thou@robkuz是的,这就是为什么我说这可能就是你所说的“进行模式匹配”。如果DU很容易像上面所说的那样表现出来,那么这很有效。然而,如果你有一个DU嵌入在另一个DU的另一个DU中。。。然后构造所有这些DU变得很麻烦,并且再次开始隐藏测试代码的意图。具体来说,如果出于测试目的,您只需要几个不一定都在同一DU中的项目。