想象一下以下示例:
class foobar
{
string b = string.Empty;
public foobar(string abc)
{
b = abc;
}
public override string ToString()
{
return b;
}
}
我可以像这样使用它:
void Main()
{
foobar test = new foobar("test string");
Console.WriteLine(test);
}
预期输出为test string
如果我这样做会怎么样?
void Main()
{
object test2 = (object)new foobar("test string 2");
Console.WriteLine (test2);
}
我仍然得到输出test string 2
,即使我将我的类封装在对象中。
当我使用方法返回的对象时,它甚至可以工作:
private object DoSomething()
{
return (object) new foobar("test3..");
}
CLR如何知道我的对象是哪种类型以及在哪里查找.ToString()实现?
这是否在跨越装配边界时使用?
答案 0 :(得分:2)
ToString()
在对象上可见并可通过对象访问。
提供方法的重写实现,并在将对象作为其祖先或基类进行访问时调用它是多态的核心要求和好处。
指定覆盖会告诉对象的元数据将对祖先的ToString()
方法的调用重新映射到新方法,即使该对象被访问就像它的祖先一样。