我有一个自定义类结构如下。
public interface Stuff { }
public Thing : Stuff
{
public new String ToString() { return "That's the thing!"; }
}
然后,在我的代码的其他部分,我有一个方法,它将 String 对象作为参数。第一行编译,而第二行不编译。我认为在发送对象时默认调用 ToString 。从 Object 类继承的 Stuff 应该已经实现了 ToString (在我的情况下,还有 my 实施)。
Thing thing = new Thing();
MustHaveString(thing.ToString());
MustHaveString(thing);
我想念什么?
答案 0 :(得分:10)
由于String.Format
和Console.WriteLine
之类的调用以及字符串连接运算符(可能会ToString
无效),您可能会感到困惑。
这个不是的一般规则。通常,如果您需要字符串,则需要明确调用ToString
或进行其他转换。我不建议创建隐式转换到string
- 它们可能会带来更多痛苦而不是欢乐。
我也建议不要创建新的ToString
方法。相反,您应该覆盖object
声明的那个。隐藏方法几乎总是一个坏主意;在某些情况下你真的想要这样做(例如改变返回类型),但应尽可能避免。
答案 1 :(得分:5)
假设MustHaveString
看起来像:
public void MustHaveString(string arg)
然后简单地说thing
会导致编译错误,除非thing
隐式转换为string
。如果没有隐式转换,您必须执行thing.ToString()
。但是,如果您的代码如下:
string myString = "This is a thing: " + thing;
然后隐式调用ToString
,因此它是可选的。
在大多数情况下,我建议明确调用ToString
方法,以便让阅读代码的人明白发生了什么。
编辑:由于此答案已被接受,我想我还应该提一下,您应该将ToString()
方法设为override
,而不是new
。这将导致正常预期的行为,这就是我上面所描述的。