Вам необходимо указать тип, если элемент в коллекции явно. Ключевое слово var
использует определение типа для определения типа переменной. В случае var
в предложении foreach
он использует конкретную реализацию IEnumerable
для определения типа.
- Если коллекция реализует только
IEnumerable
(а не универсальный IEnumerable<T>
), тогда var
будет object
- Если в коллекции реализован один универсальный
IEnumerable<T>
(скажем, IEnumerable<int>
), тогда var
будет T
(в приведенном здесь примере var
будет int
)
В вашем случае ListViewItemCollection
не реализует никакой общей формы IEnumerable<T>
, поэтому var
предполагается равным object
. Однако компилятор позволит вам указать более конкретный тип для переменной итератора, если перечислимый реализует только IEnumerable
, и он автоматически вставляет приведение к этому конкретному типу.
Обратите внимание, что, поскольку есть оператор приведения, приведение не будет выполнено во время выполнения, если объект не относится к этому конкретному типу. Например, я могу сделать это:
List<object> foo = new List<object>();
foo.Add("bar");
foo.Add(1);
foreach(string bar in foo)
{
}
Это допустимо, но завершится ошибкой, когда итератор достигнет второго элемента, поскольку это не string
.