Xunit を使用した F# で文字列の等価性をアサートするときに型情報が必要になるのはなぜですか
質問
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'.
解決
それは、 string
最初のものと 2番 オーバーロード (覚えておいてください: string :> seq<char>
).
他のヒント
あなたの例 <string>
削除されたものは、予想どおりエラーなしで実行されます(ただし、 string :> seq<char>
@Ramon Snirが指摘しているように、オーバーロード解決アルゴリズムは、提供されたものを認識することで曖昧さを解決します。 string
タイプは「に近い」 string
よりも seq<char>
).
[<Fact>]
let Test_XunitStringAssertion() =
let s1 = "Stuff"
Assert.Equal("Stuff",s1)
あなたが提供したサンプルは実際のコードとまったく同じではなく、問題を引き起こしていると思います。多分 s1
実際のコードでは、実際には string
(または少なくともコンパイラはそれを知りません)。
所属していません StackOverflow