1

我有一个自定义类结构如下。

public interface Stuff { }
public Thing : Stuff 
{ 
  public new String ToString() { return "That's the thing!"; } 
}

然后,在我的代码的其他部分,我有一个将String对象作为参数的方法。第一行编译,而第二行不编译。我认为在发送对象时默认调用ToString 。Object类继承的Stuff应该已经实现了ToString (在我的情况下,也被我的实现所掩盖)。

Thing thing = new Thing();
MustHaveString(thing.ToString());
MustHaveString(thing);

我想念什么?

4

2 回答 2

10

您可能会因为诸如String.Formatand之类的调用Console.WriteLine以及隐式调用的字符串连接运算符而ToString感到困惑。

不过,这不是一般规则。一般来说,如果您需要一个字符串,您需要ToString显式调用或进行一些其他转换。我不建议创建隐式转换string- 它们可能会带来更多的痛苦而不是快乐。

建议不要创建新ToString方法。相反,您应该覆盖由object. 隐藏方法几乎总是一个坏主意。在某些情况下您确实想要这样做(例如更改返回类型),但应尽可能避免。

于 2013-07-01T15:00:24.190 回答
5

假设MustHaveString看起来像:

public void MustHaveString(string arg)

然后简单地说thing会导致编译错误,除非thing隐式转换为string. 如果没有隐式转换,您必须执行thing.ToString(). 但是,如果您的代码如下所示:

string myString = "This is a thing: " + thing;

然后ToString隐式调用了,所以它是可选的。

在大多数情况下,我建议显式调用该ToString方法,以使阅读您的代码的人清楚地知道发生了什么。

编辑:既然这个答案被接受了,我想我还应该提到你应该让你的ToString()方法成为一个override,而不是一个new。这将导致正常预期的行为,这就是我上面描述的。

于 2013-07-01T15:03:00.500 回答