2014-06-11 44 views
3

StreamWrite.Write超載爲Int16Int32Int64DoubleSingleString等等。使用泛型類型調用重載函數

爲什麼我需要使用動態?當調用WriteList方法時,編譯器知道它要求爲Int32String,...。
那麼爲什麼我不能使用e類型T = Int32)直接在StreamWrite.Write

public void WriteList<T>(List<T> list) 
{ 
    int count = list.Count(); 
    StreamWriter.Write(count); 
    foreach(T e in list) 
    { 
    dynamic d = e; 
    StreamWriter.Write(d); 
    } 
} 
+0

請參閱:[有什麼區別,第一部分:泛型不是模板](http://blogs.msdn.com/b/ericlippert/archive/2009/07/30/generics-are-not-templates.aspx ) – Ani

回答

7

因爲重載解析(在沒有dynamic)發生在編譯時間,並且在編譯時間,T的實際類型是未知的,因爲泛型的運行時特徵。

當編譯WriteList時,編譯器不知道Write包含在IL中的哪個方法標記。

+0

這是否意味着爲每種類型編寫單獨的函數是最好的辦法,因爲沒有辦法以更一般的方式來實現這一點? – bebo

+0

@bebo - 實際上,您當前的解決方法('dynamic')似乎並不合理,尤其是因爲有一個「object」超載,無論實際類型是什麼,它都會成功。 –