我试图在MatchCollection
循环中从Regex
表达式迭代foreach
,使用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)提供的示例也使用Match
循环中的foreach
类。
但是,编译器不应该推断chapter
是Match
类型而不是object
吗?因此,似乎编译器隐式执行从object
到Match
的强制转换。这是真的吗?
答案 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; }
}