次のコードはコンパイルに失敗し (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
}
}
コンパイラは次の 2 つのエラーを返します。
'ConsoleApplication1.Program.Test(System.Collections.Generic.IEnumerable<ConsoleApplication2.ITest>)' に最も一致するオーバーロードされたメソッドには、無効な引数が含まれています
引数 1: 'System.Collections.Generic.List<ConsoleApplication2.TestClass>' から 'System.Collections.Generic.IEnumerable<ConsoleApplication2.ITest>' に変換できません