免责声明:我知道这个例子有点荒谬;只是想知道如果这种奇怪的情况出现,这种语言将允许我做什么。
考虑以下简短示例:
var anonymous = new
{
ToString = new Func<string>( () => { return "This came from my property.";} )
};
Console.WriteLine(anonymous);
Console.WriteLine(anonymous.ToString());
输出有点令人惊讶:
{ ToString = System.Func`1[System.String] }
This came from my property.
显然,当我打电话给ToString()
时,c#决定
ToString
解析为名为ToString
哪些语言结构可以让我调用ToString()
方法 而不是ToString
属性的结果?
注意:我没有尝试覆盖ToString()
(我意识到这是不可能的),我只是想知道如何调用ToString()
而不是调用属性的返回值。
答案 0 :(得分:5)
在您的匿名对象上,在编译器具有完整静态类型信息的上下文中,ToString
方法被您的属性遮蔽。但是,阴影与重写不同:当它被转发到Object
时,同名的属性会消失,ToString
的原始实现再次可见。
您看到了差异,因为Console.WriteLine
看到的是object
,而不是最精确的静态类型。这允许它忽略阴影并改为调用虚拟ToString
方法。
你也可以自己做:
object foo = anonymous;
foo.ToString();