为什么编译器无法在Regex.Matches的foreach中推断出正确的类型?

我试图从foreach循环中的Regex表达式迭代MatchCollection ,使用var关键字编译器推断chap是一个对象,它给出了一个Value属性未知的错误。

 foreach (var chapter in ChapterExtractor.Matches(page.RawContent)) { chapter.Add(chapter.Value); // Does not compile! } 

varMatch替换时,它可以完美地工作。

 foreach (Match chapter in ChapterExtractor.Matches(page.RawContent)) { chapter.Add(chapter.Value); // OK! } 

MSDN( http://msdn.microsoft.com/pt-br/library/system.text.regularexpressions.matchcollection ( v=vs.110 ) .aspx )中提供的示例也使用foreach循环中的Match类。

但是,编译器是否应该推断该chapterMatch类型而不是object ? 因此,似乎编译器隐式执行从objectMatch 。 真的吗?

但是,编译器是否应该推断chap类型是Match而不是object?

Matches返回一个不通用的MatchCollection ,它的枚举器方法返回一个object 。 因此,编译器无法推断出类型。当您使用Match时它会起作用,因为基础项是Match ,这就是为什么它不会因InvalidCastException而失败。

因此,似乎编译器隐式执行从对象到匹配的转换。 真的吗?

是的,它是真实的。

在foreach循环中,编译器使用您正在循环的对象的IEnumerable或通用IEnumerable接口。 因为MatchCollection类只有一个IEnumerable接口

 public class MatchCollection : ICollection, IEnumerable 

编译器使用

 public IEnumerator GetEnumerator(); 

它反过来给出了’对象’类型的电流

 public interface IEnumerator { object Current { get; } }