4

我还无法访问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)); 
} 

回答

6

Sam Ng对此有很大的系列blog posts。我忘记了确切的细节(并且在发布课程之前它们可能仍然会发生变化),但是这个博客系列有相当多的深度,包括泛型。

一般来说,我的理解是,结果应该(尽可能)与结果相同,如果你编译的代码与只是动态表达式被动态值的表达式替换执行时间处理时间。 (静态已知类型的被保留在调用点信息)

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

Bar(int) says: 0 

不过,在搜索这再次(并检查哪一位实际上是动态的)我有点困惑。我认为这是其中的一种情况,我必须仔细查看以了解正确的行为。不幸的是,我不知道C#4.0规范何时可用。

这是一个棘手的一个推理,我怀疑的关键部分是,是否在执行时,粘合剂是能制定出该值T型为同一T作为接收器,而不是int类型。因为接收器在这种情况下是动态的,所以编译器完全不做任何重载解析。嗯。狡猾的,绝对。

+0

我读过这个系列......没有一个类似于我的例子的明确情况,所以我不能确定。我从我读到的印象中得到Bar(int)会被调用。这将是非常好的,因为它会使我有可能使用动态作为实现C#泛型类型专用化的一种方式......直到现在,一直没有那么容易(或优雅)的事情。 – LBushkin 2009-06-12 15:24:59