为什么编译器无法在Regex.Matches的foreach中推断出正确的类型?
我试图从foreach
循环中的Regex
表达式迭代MatchCollection
,使用var
关键字编译器推断chap是一个对象,它给出了一个Value
属性未知的错误。
foreach (var chapter in ChapterExtractor.Matches(page.RawContent)) { chapter.Add(chapter.Value); // Does not compile! }
当var
被Match
替换时,它可以完美地工作。
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
类。
但是,编译器是否应该推断该chapter
是Match
类型而不是object
? 因此,似乎编译器隐式执行从object
到Match
。 真的吗?
但是,编译器是否应该推断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; } }