为什么使用Xunit的F#在字符串上断言相等时需要类型信息

时间:2012-02-25 19:17:28

标签: f# xunit

我正在使用F#和Xunit。 (我对两者都比较新)

我发现当我使用Xunit的Assert.Equal()时,我需要在被比较的类型是字符串时指定"<string>"

例如,此运行并编译:

[<Fact>]
let Test_XunitStringAssertion() =
    let s1 = "Stuff"
    Assert.Equal<string>("Stuff",s1)

我的问题是,为什么我不能删除"<string>"而只是断言"Assert.Equal("Stuff",s1)"

在我看来,编译器知道这两个参数的类型,为什么大惊小怪?

以下是编译Assert.Equal("Stuff",s1)时返回的错误:

error FS0041: A unique overload for method 'Equal' could not be determined based on type information prior to this program point. The available overloads are shown below (or in the Error List window). A type annotation may be needed.
error FS0041: Possible overload: 'Assert.Equal<'T>(expected: 'T, actual: 'T) : unit'.
error FS0041: Possible overload: 'Assert.Equal<'T>(expected: seq<'T>, actual: seq<'T>) : unit'.
error FS0041: Possible overload: 'Assert.Equal<'T>(expected: 'T, actual: 'T, comparer: System.Collections.Generic.IEqualityComparer<'T>) : unit'.
error FS0041: Possible overload: 'Assert.Equal(expected: float, actual: float, precision: int) : unit'.
error FS0041: Possible overload: 'Assert.Equal(expected: decimal, actual: decimal, precision: int) : unit'.
error FS0041: Possible overload: 'Assert.Equal<'T>(expected: seq<'T>, actual: seq<'T>, comparer: System.Collections.Generic.IEqualityComparer<'T>) : unit'.

2 个答案:

答案 0 :(得分:4)

这是因为string可以匹配第一个和第二个重载(请记住:string :> seq<char>)。

答案 1 :(得分:4)

<string>删除的示例运行没有错误,正如我所期望的那样(尽管string :> seq<char>为@Ramon Snir指出,重载解析算法通过识别提供的{{{}来解决歧义。 1}}类型比string更接近string

seq<char>

我猜您提供的示例与导致您出现问题的实际代码并不完全相同。实际代码中的[<Fact>] let Test_XunitStringAssertion() = let s1 = "Stuff" Assert.Equal("Stuff",s1) 实际上可能不是s1(或者至少编译器不知道它是)。