我不明白为什么方法 Value(string s)
从不要求元素
的 List<string>
当列表传递到 ToString<M>(List<M> list)
时方法。下面是我从 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();
}
这是输出。它表明 Value(string s) 从未被调用
Strings
Object
Object
Object
one,two,three,
Objects
Object
Object
Object
1,2,3,
Longs
Object
Object
Object
1,2,3,
最佳答案
因为绑定(bind)到 Value()
在 ToString<M>
内在编译时完成。由于 M
没有限制,它能找到的最佳重载是 Value(object)
.
为了绑定(bind)到Value(string)
您必须将参数转换为 string
或制作i
dynamic
在你的foreach
循环:
foreach(dynamic i in list)
{
sb.AppendFormat("{0},", Value(i));
}
然后将绑定(bind) Value(i)
在运行时 然后将选择是否使用 string
或 object
过载。
关于c# - 永远不会调用带有字符串参数的重载方法,而是调用带有对象参数的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21008120/