Il seguente codice non riesce a compilare (utilizzando VS2010) e non vedo perché. Il compilatore dovrebbe essere in grado di dedurre che List<TestClass>
è "compatibile" (mi dispiace per mancanza di una parola migliore) con IEnumerable<ITest>
, ma in qualche modo non è così. Cosa mi manca qui?Il compilatore C# non riconosce che una classe sta implementando un'interfaccia
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
}
}
Il compilatore dà due errori:
La partita metodo migliore overload per 'ConsoleApplication1.Program.Test (System.Collections.Generic.IEnumerable < ConsoleApplication2 .ITest >) "ha alcuni argomenti non validi
Argomento 1: non può convertire da 'System.Collections.Generic.List <ConsoleApplication2.TestClass>' a 'System.Collections.Generic.IEnumerable <ConsoleApplication2.ITest>'