Коли ви вказуєте явний тип змінної діапазону, компілятор вставляє виклик до Cast<T>. Отже це:
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
select m).Any();
точно еквівалентно:
bool result = matches.Cast<Match>()
.Where(m => m.Groups["name"].Value.Length > 128)
.Any();
що також можна записати як:
bool result = matches.Cast<Match>()
.Any(m => m.Groups["name"].Value.Length > 128);
У цьому випадку Castпотрібен виклик, оскільки MatchCollectionлише реалізує ICollectionта IEnumerable, а не IEnumerable<T>. Практично всі методи розширення LINQ to Objects орієнтовані IEnumerable<T>, за винятком винятків Castі OfType, обидва з яких використовуються для перетворення "слабо" набраної колекції (наприклад, MatchCollection) у загальну, IEnumerable<T>що надалі дозволяє проводити подальші операції LINQ.