为什么编译器无法推断出每个正则表达式.Matches的正确类型
本文关键字:Matches 类型 正则表达式 编译器 推断出 为什么 | 更新日期: 2023-09-27 18:34:46
我试图在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 而不是对象吗?
Matches
返回一个非泛型MatchCollection
,它的枚举器方法返回一个object
。因此,编译器无法推断类型。当您使用Match
时它可以工作,因为基础项是Match
的,这就是为什么它不会因InvalidCastException
而失败的原因。
因此,编译器似乎隐式执行从对象到 Match 的强制转换。这是真的吗?
是的,这是真的。
在 foreach 循环中,编译器使用要循环的对象的IEnumerable
或泛型IEnumerable<T>
接口。因为 MatchCollection 类只有一个 IEnumerable 接口
public class MatchCollection : ICollection, IEnumerable
编译器使用
public IEnumerator GetEnumerator();
这反过来又给出了类型为"对象"的电流
public interface IEnumerator
{
object Current { get; }
}