C# 永远不会调用带有字符串参数的重载方法,而是调用带有对象参数的方法

C# 永远不会调用带有字符串参数的重载方法,而是调用带有对象参数的方法,c#,overloading,C#,Overloading,我不明白为什么从不为元素调用方法Value(string s) 当列表被传递到ToString(List List)方法时的List。下面是我从LinqPad中提取的测试代码 在迭代ToString(List List)方法之外的列表时,调用适当的Value()方法没有问题 谢谢大家! void Main() { var list1 = new List<string>{"one","two","three"}; var list2 = new List<obj

我不明白为什么从不为元素调用方法
Value(string s)
当列表被传递到
ToString(List List)
方法时的
List
。下面是我从LinqPad中提取的测试代码

在迭代
ToString(List List)
方法之外的列表时,调用适当的
Value()
方法没有问题

谢谢大家!

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();
}

因为对
ToString
Value()
的绑定是在编译时完成的。由于
M
没有约束,因此它能找到的最佳重载是
Value(object)

为了绑定到
Value(string)
您必须将参数强制转换为
string
,或者在
foreach
循环中使
i
动态

foreach(dynamic i in list)
{
    sb.AppendFormat("{0},", Value(i));
}
然后在运行时绑定
值(i)
,然后选择是使用
字符串
还是
对象
重载

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