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

Joh*_* Wu 1 .net c#

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

考虑以下简短示例:

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

  1. 将符号解析为ToString名为的属性ToString
  2. 检索它的值,这是一个Func
  3. 执行该函数并检索其返回值

有哪些语言结构可以让我调用ToString() 方法而不是ToString属性的结果?

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

zne*_*eak 5

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

你看到了一个区别,因为Console.WriteLine看到的是一种object不是最精确的静态类型.这允许它忽略阴影并ToString改为调用虚方法.

你也可以自己做:

object foo = anonymous;
foo.ToString();
Run Code Online (Sandbox Code Playgroud)

实例.