Когда я использую цикл foreach
на C#, кажется, что проверка типа времени компиляции не выполняется, если тип элемента является типом интерфейса.Почему foreach пропускает проверку типа времени компиляции типов интерфейсов?
E.g.
class SomeClass {}
interface SomeInterface {}
IEnumerable<SomeClass> stuff;
foreach(SomeInterface obj in stuff) { // This compiles - why!?
}
Это будет счастливо компилировать и вызвать исключение во время выполнения, когда станет ясно, во время компиляции это не имеет никакого смысла. Если изменить тип элемента из SomeInterface
к другому классу, то во время компиляции типа проверки восстанавливается:
IEnumerable<SomeClass> stuff;
foreach(Random obj in stuff) { // This doesn't compile - good!
}
Почему же нет компиляции проверяет тип времени, когда тип элемента представляет собой интерфейс?
(Это происходит с .NET 3.5 SP1 в Visual Studio 2008)
Да, я задавался вопросом (и был укушен) тем же самым. С нетерпением ждем ответов от тех, кто знает! – Eyvind