F#使用MSTest测试无法解决方法Overload

问题描述 投票:0回答:1

作为一项学习练习,我正在尝试使用MSTest测试一些F#代码。我遇到了一个使我发疯的问题,不是因为我无法处理它,而是因为我不明白如何正确添加类型注释来确定我正在使用的超载方法(这意味着我没有正确地学习了我试图学习的东西)。 nyway,这是非工作代码的简化示例:

[<TestClass>] type MyTests () = [<TestMethod>] member this.SyntaxTest () = Assert.AreEqual<bool>(true, false) // compiles Assert.AreEqual<bool>(expected=true, actual=false) // compiles Assert.AreEqual<bool>((true : bool), (false : bool)) // compiles Assert.AreEqual<bool>(true, false, "message string") // fails to compile Assert.AreEqual<bool>(true, false, ("message string" : string)) // fails to compile Assert.AreEqual<bool>(expected=true, actual=false, message="message string") // fails to compile // Simple work around that doesn't answer how to properly make the Assert.AreEqual call: if (true <> false) then do Assert.Fail("Fail message")

可以在评论中看到,仅使用BOOL输入的版本使用几种类型和参数符号的不同版本都可以正常工作。但是,一旦我添加了一个消息字符串,我什么也没能想到的。
我得到的失败代码是:

FS0041:在此程序点之前,无法根据类型信息来确定方法“ ate equal”的唯一过载。可能需要一种类型的注释。 Known types of arguments: bool * bool * string Candidates: - Assert.AreEqual

(expected: 'T | null, actual: 'T | null, message: string | null) : unit - Assert.AreEqual
(expected: 'T | null, actual: 'T | null, message: string | null, [] parameters: obj | null array | null) : unit ....

<'T> <'T>从Microsoft文档

link

link有很多不同的断言。签名略有不同的方法,但是我显然不知道如何告诉F#编译器我想要哪一个。从我阅读的内容来看,我认为添加“:string”或“ message =”可能会有所帮助,但这无济于事。 有人知道如何使编译器正确解决方法过载问题吗?另外,如果任何人都可以链接到此问题的确定资源,那真是太神奇了!

types f# overloading mstest
1个回答
0
投票

void AreEqual<T>(T? expected, T? actual, string? message)

(无效的类型是C#的真正丑陋功能,它们必须介绍,因为无效的值在该语言中是如此普遍,但我离题。)

为了帮助F#找到正确的过载,您必须明确转换使您的值无效:

open System ... Assert.AreEqual(Nullable true, Nullable false, "message string")

好消息是您可以删除
<Nullable<bool>>

类型参数,因为F#会为您推断出来。

	

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.