Коли ви вказуєте явний тип змінної діапазону, компілятор вставляє виклик до 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.