当一个方法被一个可调用的属性掩盖时如何调用它?

时间:2018-04-18 02:36:29

标签: c# .net

免责声明:我知道这个例子有点荒谬;只是想知道如果这种奇怪的情况出现,这种语言将允许我做什么。

考虑以下简短示例:

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#决定

  1. 将符号ToString解析为名为ToString
  2. 的属性
  3. 检索其值,即Func
  4. 执行该函数并检索其返回值
  5. 哪些语言结构可以让我调用ToString() 方法 而不是ToString属性的结果?

    注意:我没有尝试覆盖ToString()(我意识到这是不可能的),我只是想知道如何调用ToString()而不是调用属性的返回值。

1 个答案:

答案 0 :(得分:5)

在您的匿名对象上,在编译器具有完整静态类型信息的上下文中,ToString方法被您的属性遮蔽。但是,阴影与重写不同:当它被转发到Object时,同名的属性会消失,ToString的原始实现再次可见。

您看到了差异,因为Console.WriteLine看到的是object,而不是最精确的静态类型。这允许它忽略阴影并改为调用虚拟ToString方法。

你也可以自己做:

object foo = anonymous;
foo.ToString();

Live example