当您指定显式范围变量类型时,编译器将插入对的调用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操作。