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