6

我还没有访问 C# 4.0 预览版的权限。但我很好奇,C# 4.0 运行时在以下情况下调用重载方法时会做什么。它是否解决了通用重载......或专门的重载。

public class Foo<T>
{
  protected string BarImpl( T value ) { return "Bar(T) says: " + value.ToString(); }

  protected string BarImpl( int value ) { return "Bar(int) says: " + value.ToString(); }

  public string Bar( T value )
  {
    dynamic foo = this;
    return foo.BarImpl( value );
  }
}

public static void Main( string args[] )
{
  var f = new Foo<int>();

  Console.WriteLine( f.Bar( 0 ) );
}
4

1 回答 1

6

一般来说,我的理解是,如果您编译相同的代码,仅将动态表达式替换为动态值在执行时具有的类型的表达式,则结果应该(尽可能)与结果相同。(静态已知类型保留在调用站点信息中。)

在这种特殊情况下,只有您的代码使用 .NET 4.0b1,结果是:

Bar(int) says: 0

然而,再次查看这个(并检查了哪个位实际上是动态的)我有点困惑。我认为这是我必须非常仔细地查看规范以了解正确行为的情况之一。不幸的是,我不知道 C# 4.0 规范何时可用。

这是一个棘手的推理,我怀疑关键部分是在执行时,绑定器是否能够计算出该值的类型与接收者T相同T,而不是 type int。因为在这种情况下接收器是动态的,所以编译器根本不做任何重载决议。唔。棘手的一个,肯定的。

于 2009-06-12T15:20:09.900 回答