LBu*_*kin 6 c# overloading dynamic-language-runtime dynamic-languages c#-4.0
我还没有访问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 ) );
}
Run Code Online (Sandbox Code Playgroud)
一般来说,我理解结果应该(只要有可能)与结果相同,如果你编译相同的代码只用动态表达式替换动态值在执行时具有的类型的表达式.(静态已知类型保留在呼叫站点信息中.)
在这种特殊情况下,只使用.NET 4.0b1的代码,结果是:
Bar(int) says: 0
Run Code Online (Sandbox Code Playgroud)
然而,再看一遍(并检查哪个位实际上是动态的)我有点困惑.我认为这是其中一种情况,我必须非常仔细地查看规范,以了解正确的行为是什么.不幸的是,我不知道何时可以使用C#4.0规范.
理由是这是一个棘手的问题,我怀疑关键部分是在执行时,绑定器是否能够计算出值与接收器的类型T相同T,而不是类型int.因为在这种情况下接收器是动态的,所以编译器根本不执行任何重载决策.嗯.绝对是一个棘手的.