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 Castchamada é necessária porque MatchCollectionapenas implementa ICollectione 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 Caste 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.