【发布时间】:2011-06-22 01:18:20
【问题描述】:
前几天我注意到了,说你有两个重载的方法:
public void Print<T>(IEnumerable<T> items) {
Console.WriteLine("IEnumerable T");
}
public void Print<T>(T item) {
Console.WriteLine("Single T");
}
这段代码:
public void TestMethod() {
var persons = new[] {
new Person { Name = "Yan", Age = 28 },
new Person { Name = "Yinan", Age = 28 }
};
Print(persons);
Print(persons.ToList());
}
打印:
Single T
Single T
为什么在这些情况下Person[] 和List<Person> 与T 的匹配比与IEnumerable<T> 的匹配更好?
谢谢,
更新: 另外,如果你有另一个超载
public void Print<T>(List<T> items) {
Console.WriteLine("List T");
}
Print(persons.ToList()); 实际上会打印List T 而不是Single T。
【问题讨论】:
-
调用
Print(persons as IEnumerable<Person>);应该调用其他方法。泛型方法查找不会执行从Person[]到IEnumerable<Person>的隐式转换。当您调用person.ToList()时,您的直接类型是List<Person>(也不需要隐式转换)。 -
+1 我一直在摆弄这个问题。
标签: c# .net overloading overload-resolution