Quando si specifica un tipo di variabile di intervallo esplicito , il compilatore inserisce una chiamata a Cast<T>. Così questo:
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
select m).Any();
è esattamente equivalente a:
bool result = matches.Cast<Match>()
.Where(m => m.Groups["name"].Value.Length > 128)
.Any();
che può anche essere scritto come:
bool result = matches.Cast<Match>()
.Any(m => m.Groups["name"].Value.Length > 128);
In questo caso la Castchiamata è richiesta perché MatchCollectionimplementa solo ICollectione IEnumerable, no IEnumerable<T>. Quasi tutti i metodi di estensione LINQ to Objects sono destinati IEnumerable<T>, con le notevoli eccezioni di Caste OfType, entrambi utilizzati per convertire una raccolta di tipo "debole" (come MatchCollection) in una generica IEnumerable<T>, il che consente quindi ulteriori operazioni LINQ.