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