下面的代码无法编译(使用VS2010),我不知道原因。编译器应该能够推断出List<TestClass>
与IEnumerable<ITest>
是“兼容”的(对不起,没有更好的词语),但不知何故它没有。我在这里漏掉了什么?
interface ITest {
void Test();
}
class TestClass : ITest {
public void Test() {
}
}
class Program {
static void Test(IEnumerable<ITest> tests) {
foreach(var t in tests) {
Console.WriteLine(t);
}
}
static void Main(string[] args) {
var lst = new List<TestClass>();
Test(lst); // fails, why?
Test(lst.Select(t=>t as ITest)); //success
Test(lst.ToArray()); // success
}
}
编译器报了两个错误:
'ConsoleApplication1.Program.Test(System.Collections.Generic.IEnumerable<ConsoleApplication2.ITest>)' 的最佳重载方法存在一些无效的参数
参数 1:无法将类型为 'System.Collections.Generic.List<ConsoleApplication2.TestClass>' 的对象隐式转换为类型 'System.Collections.Generic.IEnumerable<ConsoleApplication2.ITest>'