Почему foreach пропускает проверку типов времени компиляции для типов интерфейсов? - PullRequest
6 голосов
/ 02 августа 2010

Когда я использую цикл foreach в C #, создается впечатление, что проверка типа времени компиляции не выполняется, если тип элемента является типом интерфейса.

Е.Г.

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)

1 Ответ

8 голосов
/ 02 августа 2010

НЕ ясно во время компиляции, имеет ли другая часть программы, возможно, в другом проекте:

class SomeOtherClass : SomeClass, ISomeInterface
{
   public static IEnumerable<SomeClass> GetSomeStuff()
   {
      for( int i = 0; i<10; ++i)
         yield return new SomeOtherClass(i);
   }
}

Теперь проверка во время выполнения SUCCEEDS.

Если вы отметите SomeClass как sealed, тогда это невозможно, и снова можно узнать во время компиляции, что приведение не будет работать.

...