与字符串参数重载方法不会被调用,与对象参数调用该方法,而不是

问题描述:

我不明白为什么当列表被传递到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, 

因为在编译时完成ToString<M>结合Value()。由于M没有限制,因此可以找到的最佳超载是Value(object)

为了绑定到Value(string)你必须要么参数转换为string或使idynamicforeach循环:

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

这将然后绑定Value(i)在运行时这然后会选择是否使用stringobject过载。