【发布时间】:2012-09-19 12:16:22
【问题描述】:
我正在编写一些单元测试,实际上我正在重构后修复单元测试,我注意到一些非常奇怪的行为。原始断言使用了 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 中的函数上看起来就是这样?
【问题讨论】:
-
你能发布一个最小版本的
X类(也许还有 Foo.Do() 的返回值的类)来重现这个吗?
标签: c# unit-testing generics type-conversion