微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 在基类中标记ToString虚拟,会发生什么?

考虑以下( 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] 举报,一经查实,本站将立刻删除。

相关推荐