与字符串参数重载方法不会被调用,与对象参数调用该方法,而不是
问题描述:
我不明白为什么当列表被传递到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
或使i
dynamic
在foreach
循环:
foreach(dynamic i in list)
{
sb.AppendFormat("{0},", Value(i));
}
这将然后绑定Value(i)
在运行时这然后会选择是否使用string
或object
过载。