使用动态类型在C#4.0中重载分辨率

时间:2009-06-12 15:09:47

标签: c# c#-4.0 dynamic-language-runtime dynamic-languages overloading

我还没有访问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 ) );
}

1 个答案:

答案 0 :(得分:6)

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

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

Bar(int) says: 0

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

这是一个很难理解的问题,我怀疑关键部分是在执行时绑定器是否能够计算出T类型的值与T相同的int接收器,而不是类型{{1}}。由于接收器在这种情况下是动态的,因此编译器根本不会执行任何重载决策。嗯。绝对是一个棘手的人。