考虑以下(
LinqPad)示例. X类中的ToString标记为虚拟.为什么这里的输出不等于“嗨,我是Y,嗨,我是X”,而是打印出类型名称?当然标记ToString virtual是错误的,因为它在Object中被定义为虚拟,我只是想了解这里发生了什么.
void Main() { Y y = new Y(); Console.WriteLine(y); } // Define other methods and classes here class X { public virtual String ToString() { return "Hi,I'm X"; } } class Y : X { public override String ToString() { return "Hi,I'm Y," + base.ToString(); } }
解决方法
那就是在X中创建一个名为ToString()的新虚拟方法,它隐藏了Object.ToString().所以如果你有:
Y y = new Y(); X x = y; Object o = y; Console.WriteLine(y.ToString()); // Shows "Hi,Hi,I'm X"; Console.WriteLine(x.ToString()); // Shows "Hi,I'm X"; Console.WriteLine(o.ToString()); // Calls object.ToString; shows just "Y"
打电话给
Console.WriteLine(y);
相当于最后一行,这就是打印类型名称的原因.
基本上,您的X.ToString方法应该覆盖object.ToString()方法:
public override String ToString() { return "Hi,I'm X"; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。