为什么Assert.AreEqual在具有隐式转换运算符的自定义结构上失败?我创建了一个自定义结构来表示金额。它基本上是十进制的包装器。它有一个隐式转换运算符,可以将其转换为十进制。在我的单元测试中,我断言Amount等于原始十进制值,但测试失败。[测试方法]publicvoidAmountAndDecimal_AreEqual(){金额amount=1.5M;Assert.AreEqual(1.5M,金额);当我使用int时测试确实成功了(我没有创建转换运算符)。[测试方法]publicvoidAmountAndInt_AreEqual(){金额amount=1;Assert.AreEqual(1,金额);当我hoverAreEqual时,它表明第一个解析为publicstaticvoidAreEqual(objectexpected,objectactual);第二个结果是publicstaticvoidAreEqual(Texpected,Tactual);看起来int值1被隐式转换为Amount,而十进制值1.5M则没有。我不明白为什么会这样。我本来希望恰恰相反。第一个单元测试应该能够将小数转换为金额。当我向int添加隐式转换(这没有意义)时,第二个单元测试也失败了。因此,添加隐式转换运算符会破坏单元测试。我有两个问题:这种行为的解释是什么?如何修复Amount结构以使两个测试都成功?(我知道我可以更改测试以进行显式转换,但如果不是绝对必须的话我不会这样做)我的金额结构(只是显示问题的最小实现)私人金额(十进制值){_value=value;}publicstaticimplicitoperatorAmount(decimalvalue){returnnewAmount(value);}publicstaticimplicitoperatordecimal(Amountamount){returnamount._value;这是隐式转换可能发生的坏事的一个例子。由于隐式转换,编译器能够选择Assert.AreEqual(1.5M,amount);和Assert.AreEqual(1.5M,amount);价值相等。*因为它们是相同的,所以两个推论都不会导致过载。由于没有overloadselectbyinference,所以不能放入list中选择最佳匹配,只有(object,object)形式。所以被选中了。使用Assert.AreEqual(1,amount)然后因为存在从int到Amount的隐式转换(通过隐式int->decimal)而不是从Amount到int,编译器认为“显然他们在这里意味着Assert.AreEqual()”?,所以它被选中了。您可以使用Assert.AreEqual()或Assert.AreEqual()显式选择重载,但如果可能的话,您最好将其中一个转换“显着缩小”,因为结构的这一特性会再次伤害您。(华友世纪发现了用于单元测试的错误)。*另一个有效的重载选择是选择Assert.AreEqual,但它永远不会被推理选择,因为:被拒绝的重载都被认为更好。无论如何,它总是被非通用形式所取代。因此,只能通过将其包含在代码中来调用它。?编译器将它所说的一切都视为显而易见或完全不可理解的。也有这样的人。以上是C#学习教程:WhydoesAssert.AreEqualfailonacustomstructwithanimplicitconversionoperator?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
