3

我正在编写一些单元测试,实际上我正在重构后修复单元测试,我注意到一些非常奇怪的行为。原始断言使用了 AreEqual 方法的非泛型风格。

Assert.AreEqual(Foo.Do(...), Bar.Do(...).Conversion(...));

经过一些重构, Foo.Do() 不再返回相同的类型,需要额外的转换来保持等价。但是,AreEquals 函数很乐意接受任何对象,因此测试在运行时失败,而不是像人们希望的那样在编译时失败。

因此,我决定将断言更改为它们的通用对应项,以强制将来此类更改会变成编译时错误。

Assert.AreEqual<X>(Foo.Do(...), Bar.Do(...).Conversion(...));

此时,我还没有更改 Foo.Do() 以返回正确的类型,所以我应该得到一个编译错误,即 Foo.Do() 的返回不是 X。令我惊讶的是,没有任何反应。编译成功就好了。我假设某处的类型之间必须存在隐式转换,但一些实验表明没有。我已经尝试了一些其他模拟示例,以查看具有非泛型和泛型风格的函数是否会以这种方式进行交互,但我无法重现此行为,除非使用此类。

为什么编译器不强制这两个值都是 X 类型,即使如果您将鼠标悬停在 Visual Studio 中的函数上,它似乎暗示了什么?

4

1 回答 1

1

经过一番令人沮丧的搜索后,我最终在一组扩展方法中找到了一个隐式转换,这些方法被另一个测试中的另一行代码拉入,与手头的类型完全无关。从那以后,我与那个进行黑客攻击的人交谈过。另一个隐式转换失败。

于 2012-09-27T19:36:10.317 回答