如何在静态类中重写ToString?

时间:2008-11-10 16:38:18

标签: c# .net static override

我有一个公共静态类,我想要一个ToString()方法。

我已将其定义为公共静态字符串ToString(),但收到以下警告:

  

'Class.ToString()'隐藏继承的成员'object.ToString()'。要使当前成员覆盖该实现,请添加override关键字。否则添加新关键字。

如果我添加override关键字,我会收到此错误:

  

静态成员'Class.ToString()'不能标记为覆盖,虚拟或抽象

如何摆脱该警告并让我的静态类具有ToString()方法。

谢谢你,
基思

3 个答案:

答案 0 :(得分:12)

是的,使用“new”修饰符将有效地使编译器警告静音,但您使用静态方法显式隐藏实例方法。 (这与覆盖方法不同。)通常,您不希望隐藏实例方法,除非有很好的理由,您实际上不应该使用静态方法隐藏它,因为这实际上会更改调用的行为语义。 .NET中的每个对象都有一个名为ToString()的实例方法,该方法具有开发人员期望的特定行为;通过使用新的静态方法隐藏该行为,您正在改变这种期望,这可能会导致很多混乱。

你有什么“穿线”?静态类通常不保持内部状态,因此实际上不应该提供任何内部数据作为ToString()调用的逻辑输出。您可能需要重新考虑您的类设计或提供不同的方法名称,以更清楚地指示方法的目的而不隐藏实例ToString()。

答案 1 :(得分:3)

在静态类中,您无法覆盖ToString。 .ToString是一个实例方法,根据定义,静态类只能有静态成员。

另外,为什么要覆盖.ToString()?无法获取类的实例,因此无法调用该函数。

注意:使用新语法不会覆盖.ToString。它将创建一个与Object.ToString()方法完全无关的新成员。

答案 2 :(得分:2)

好的,所以在提问时,我找到了答案:

新修饰符:

  

http://msdn.microsoft.com/en-us/library/51y09td4(VS.71).aspx#vclrfnew_newmodifier

现在是方法:

  

public new static string ToString()

谢谢你, 基思