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>())
Test
denen 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.