隐式与显式StringBuilder.ToString()cethod调用

时间:2012-08-07 11:18:33

标签: c# unit-testing tostring stringbuilder implicit-conversion

我刚刚写了一个小单元测试,其中我使用了StringBuilder。

var stringBuilder = new StringBuilder();
stringBuilder.Append("Foo");

Assert.AreEqual(stringBuilder, "Foo");

此测试将失败。

Expected: <Foo>
But was:  "Foo"

但如果我将Assert更改为

Assert.AreEqual(stringBuilder.ToString(), "Foo");

测试将通过。

那么隐式调用和ToString()方法的显式调用有什么区别?或者/这些括号(&lt;&gt;)代表什么?

2 个答案:

答案 0 :(得分:6)

在您的第一个示例中,您正在测试StringBuilder 实例是否等于字符串,这将失败。

在你的第二个中,你正在测试对ToString()(这是一个字符串)的调用结果是否等于另一个字符串。


括号(&lt;&gt;)是NUnits方式,表示它有一个非字符串对象,但要显示该消息,NUnit会在该对象上调用ToString()

Expected: <Foo> But was: "Foo"

所以<Foo>是一个在Foo调用时返回ToString()的对象,而"Foo"只是String Foo

MSTest会向您显示不同的消息,这将更加明确:

Expected:<Foo (System.Text.StringBuilder)>. Actual:<Foo (System.String)>.   

答案 1 :(得分:0)

在第一个版本中,没有对ToString的隐式调用 这只发生在Console.WriteLine等方法中。

所以实际发生的是你将一个stringbuilder对象等同于一个字符串对象。甚至类型也不匹配: - )