Cuando especifica un tipo de variable de rango explícito , el compilador inserta una llamada a Cast<T>
. Así que esto:
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
select m).Any();
es exactamente equivalente a:
bool result = matches.Cast<Match>()
.Where(m => m.Groups["name"].Value.Length > 128)
.Any();
que también se puede escribir como:
bool result = matches.Cast<Match>()
.Any(m => m.Groups["name"].Value.Length > 128);
En este caso la Cast
llamada es necesaria porque MatchCollection
solo implementa ICollection
y IEnumerable
, no IEnumerable<T>
. Casi todos los métodos de extensión de LINQ to Objects están dirigidos a IEnumerable<T>
, con las notables excepciones de Cast
y OfType
, los cuales se utilizan para convertir una colección de tipo "débil" (como MatchCollection
) en una genérica IEnumerable<T>
, lo que permite realizar más operaciones LINQ.