Debe especificar el tipo si el elemento en la colección explícitamente. La palabra clave var
utiliza la inferencia de tipo para determinar el tipo de la variable. En el caso de var
en una cláusula foreach
, utiliza la implementación particular de IEnumerable
para determinar el tipo.
- Si la colección sólo implementa
IEnumerable
(y no un genérico IEnumerable<T>
), entonces var
habrá object
- Si la colección implementa genérico
IEnumerable<T>
(por ejemplo, IEnumerable<int>
), entonces var
habrá T
(en el ejemplo aquí, var
habría int
)
En su caso, ListViewItemCollection
no implementa ninguna forma genérica de IEnumerable<T>
, por lo que var
se supone que es object
. Sin embargo, el compilador le permitirá especificar un tipo más específico para la variable del iterador si el enumerable solo implementa IEnumerable
, e inserta automáticamente un molde para ese tipo en particular.
Tenga en cuenta que, dado que hay un operador de conversión, la conversión fallará en el tiempo de ejecución si el objeto no es de ese tipo en particular.Por ejemplo, yo puedo hacer esto:
List<object> foo = new List<object>();
foo.Add("bar");
foo.Add(1);
foreach(string bar in foo)
{
}
Esto es legal, pero fallará cuando el iterador alcanza el segundo punto, ya que no es un string
.
¿Por qué var no será suficiente en esta situación? – sooprise
¿Qué otras situaciones es var no suficiente? – sooprise
El tipo de colección de elementos es Object. Es por eso que la inferencia hace que la variable detrás de var también sea un Objeto. Los elementos de la vista de lista pueden ser una colección de ListViewItem si los agrega manualmente o una colección de sus propios objetos si usa DataSource. – Larry