The ``++foreach++`` statement was introduced in the C# language prior to generics to make it easier to work with the non-generic collections available at that time such as ``++ArrayList++``. The ``++foreach++`` statements allows you to downcast elements of a collection of ``++Object++``s to any other type. The problem is that to achieve the cast, the ``++foreach++`` statements silently performs ``++explicit++`` type conversion, which at runtime can result in an ``++InvalidCastException++``.
C# code iterating on generic collections or arrays should not rely on ``++foreach++`` statement's silent ``++explicit++`` conversions.
The rule ignores iterations on collections of ``++object++``s. This includes legacy code that uses ``++ArrayList++``. Furthermore, the rule does not report on cases when user defined conversions are being called.