11

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

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

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

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

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

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

谢谢你,
基思

4

3 回答 3

16

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

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

于 2008-11-10T17:04:11.323 回答
3

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

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

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

于 2008-11-10T16:40:19.907 回答
2

好的,所以在问这个问题时,我找到了答案:

新修改器:

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

这是现在的方法:

公共新静态字符串 ToS​​tring()

谢谢你,基思

于 2008-11-10T16:39:43.980 回答