为什么编译器无法推断出每个正则表达式.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!
}

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( 中提供的示例也使用 foreach 循环中的 Match 类。

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

为什么编译器无法推断出每个正则表达式.Matches的正确类型

但是,编译器不应该推断 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; }
}