Quando você especifica um tipo de variável de intervalo explícito , o compilador insere uma chamada para Cast<T>
. Então, é isso:
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
select m).Any();
é exatamente equivalente a:
bool result = matches.Cast<Match>()
.Where(m => m.Groups["name"].Value.Length > 128)
.Any();
que também pode ser escrito como:
bool result = matches.Cast<Match>()
.Any(m => m.Groups["name"].Value.Length > 128);
Neste caso, a Cast
chamada é necessária porque MatchCollection
apenas implementa ICollection
e IEnumerable
, não IEnumerable<T>
. Quase todos os métodos de extensão LINQ to Objects são direcionados IEnumerable<T>
, com as notáveis exceções de Cast
e OfType
, ambos os quais são usados para converter uma coleção de tipos "fracos" (como MatchCollection
) em um genérico IEnumerable<T>
- que então permite outras operações LINQ.