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 Cast
chiamata è richiesta perché MatchCollection
implementa solo ICollection
e IEnumerable
, no IEnumerable<T>
. Quasi tutti i metodi di estensione LINQ to Objects sono destinati IEnumerable<T>
, con le notevoli eccezioni di Cast
e OfType
, entrambi utilizzati per convertire una raccolta di tipo "debole" (come MatchCollection
) in una generica IEnumerable<T>
, il che consente quindi ulteriori operazioni LINQ.