Lorsque vous spécifiez un type de variable de plage explicite , le compilateur insère un appel à Cast<T>
. Donc ça:
bool result = (from Match m in matches
where m.Groups["name"].Value.Length > 128
select m).Any();
équivaut exactement à:
bool result = matches.Cast<Match>()
.Where(m => m.Groups["name"].Value.Length > 128)
.Any();
qui peut aussi s'écrire:
bool result = matches.Cast<Match>()
.Any(m => m.Groups["name"].Value.Length > 128);
Dans ce cas, l' Cast
appel est requis car MatchCollection
implémente uniquement ICollection
et IEnumerable
, pas IEnumerable<T>
. Presque toutes les méthodes d'extension LINQ to Objects sont ciblées IEnumerable<T>
, à l'exception notable de Cast
et OfType
, qui sont tous deux utilisés pour convertir une collection typée "faiblement" (telle que MatchCollection
) en un générique IEnumerable<T>
- qui permet ensuite d'autres opérations LINQ.