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

Lea*_*res 2 c# type-inference compiler-errors

我试图通过遍历MatchCollection从Regex一个内表达foreach循环,使用var关键字编译器推断那家伙是给我一个错误,对象Value属性是未知的.

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

何时var被Match它取代它完美无缺.

foreach (Match chapter in ChapterExtractor.Matches(page.RawContent))
{
    chapter.Add(chapter.Value); // OK!
}
Run Code Online (Sandbox Code Playgroud)

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

但是,编译器不应该推断出chapter类型Match而不是object?所以,似乎编译器隐式执行object转换为Match.真的吗?

Sel*_*enç 5

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

Matches返回一个MatchCollection非泛型的,它的枚举方法返回一个object.因此,编译器无法推断出类型.当你使用时它会起作用,Match因为底层的项目就是这样Match,这就是它不会失败的原因InvalidCastException.

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

是的,它是真实的.