Следующий код не удается скомпилировать (используя 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 > ' to 'System.Collections.Generic.IEnumerable < ConsoleApplication2.ITest > '