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

时间:2014-12-20 22:27:56

标签: c# compiler-errors type-inference

我试图在MatchCollection循环中从Regex表达式迭代foreach,使用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)提供的示例也使用Match循环中的foreach类。

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

2 个答案:

答案 0 :(得分:5)

  

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

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

  

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

是的,这是真的。

答案 1 :(得分:2)

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

public class MatchCollection : ICollection, IEnumerable

编译器使用

public IEnumerator GetEnumerator();

反过来提供类型&#39;对象的电流&#39;

public interface IEnumerator
{
    object Current { get; }
}