2014-01-08 45 views
4

我不明白爲什麼當列表被傳遞到ToString<M>(List<M> list)方法方法Value(string s)絕不會爲元素的List<string> 。以下是我從LinqPad中提取的測試代碼。與字符串參數重載方法不會被調用,與對象參數調用該方法,而不是

我在調用正確Value()方法的同時重複遍歷ToString<M>(List<M> list)方法的列表時沒有問題。

謝謝!

void Main() 
{ 
    var list1 = new List<string>{"one","two","three"}; 
    var list2 = new List<object>{1,2,3}; 
    var list3 = new List<long>{1,2,3}; 
    "Strings".Dump(); 
    ToString<string>(list1); 
    //list1.ForEach(i=> Value(i)); // proper overload of Value() is called 
    "Objects".Dump(); 
    ToString<object>(list2); 
    //list2.ForEach(i=> Value(i)); 
    "Longs".Dump(); 
    ToString<long>(list3); 
    //list3.ForEach(i=> Value(i)); 
} 

public static string ToString<M>(List<M> list) 
{ 

    var sb = new StringBuilder(); 
    foreach(M i in list) 
    { 
     sb.AppendFormat("{0},", Value(i)); 
    } 
    var str = sb.ToString(); 
    str.Dump(); 
    return str; 
} 


public static string Value(string s) 
{ 
    "String".Dump(); 
    return "'" + s + "'"; 
} 

// Define other methods and classes here 
public static string Value(object o) 
{ 
    "Object".Dump(); 
    return o.ToString(); 
} 

這裏是輸出。這表明價值(String s)將永遠不會被調用

Strings 
Object 
Object 
Object 
one,two,three, 
Objects 
Object 
Object 
Object 
1,2,3, 
Longs 
Object 
Object 
Object 
1,2,3, 

回答

6

因爲在編譯時完成ToString<M>結合Value()。由於M沒有限制,因此可以找到的最佳超載是Value(object)

爲了綁定到Value(string)你必須要麼參數轉換爲string或使idynamicforeach循環:

foreach(dynamic i in list) 
{ 
    sb.AppendFormat("{0},", Value(i)); 
} 

這將然後綁定Value(i)在運行時這然後會選擇是否使用stringobject過載。

相關問題