Warum erlaubt der C # -Compiler das Kompilieren und löst beim Ausführen eine Laufzeitausnahme aus?
class Program
{
static void Main(string[] args)
{
IEnumerable<Test> list = new List<Test>() { new Test() };
foreach(IDisposable item in list)
{
}
}
}
public class Test
{
}
Dies wird mit jeder Schnittstelle kompiliert und nicht kompiliert, wenn Sie IDisposable durch eine konkrete Klasse ersetzen.
foreach (IDisposable item in list.OfType<IDisposable>())
Testdenen es implementiert wirdIDisposable. Tatsächlich versucht foreach, jedes Element in die Schnittstelle umzuwandeln, und löst eine Ausnahme aus, wenn dies fehlschlägt. Das gleiche, als würdest du schreiben(IDisposable)currentElement. Ich kann jedoch nicht verstehen, warum es nicht in der konkreten Klasse kompiliert werden sollte.