我正在编写一些单元测试,实际上我正在重构后修复单元测试,我注意到一些非常奇怪的行为。原始断言使用了 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 中的函数上,它似乎暗示了什么?