Po określeniu jawnego typu zmiennej zakresu kompilator wstawia wywołanie Cast<T>
. Więc to:
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
select m).Any();
jest dokładnie równoważne z:
bool result = matches.Cast<Match>()
.Where(m => m.Groups["name"].Value.Length > 128)
.Any();
który można również zapisać jako:
bool result = matches.Cast<Match>()
.Any(m => m.Groups["name"].Value.Length > 128);
W tym przypadku Cast
wywołanie jest wymagane, ponieważ MatchCollection
tylko implementuje, ICollection
a IEnumerable
nie IEnumerable<T>
. Prawie wszystkie metody rozszerzenia LINQ to Objects są przeznaczone dla IEnumerable<T>
, z godnymi uwagi wyjątkami Cast
i OfType
, z których oba są używane do konwertowania kolekcji typu „słabo” (na przykład MatchCollection
) na typ ogólny IEnumerable<T>
- co następnie umożliwia dalsze operacje LINQ.