C# var 关键字混淆:类型“对象”不包含 的定义.错误

本文关键字:包含 错误 定义 对象 关键字 var 类型 | 更新日期: 2023-09-27 18:35:14

我正在编写这段C#代码:

static void Main()
    {
        List<string> matches = new List<string>();
        var result = Regex.Matches(myString, @"'((.*?)')");
        foreach(var x in result)
            matches.Add(x.Groups[1].Value.ToString());
    }

我很惊讶地看到它失败并显示以下错误消息:

类型"对象"不包含"组"的定义,并且没有 可以找到类型为"对象"的扩展方法"组"。

但是,这有效:

foreach(Match x in result)
    matches.Add(x.Groups[1].Value.ToString());

Matches()方法返回一个MatchCollection,难道不应该清楚xMatch吗?

C# var 关键字混淆:类型“对象”不包含 的定义.错误

不应该清楚x是匹配吗?

可惜没有。

MatchCollection实现了IEnumerable,非通用遗留接口。它不实现IEnumerable<Match> 。 所以不,这不清楚。

由于 foreach 循环是在泛型之前的时代设计的,因此它会自动将强制转换插入到循环变量类型中。 那是

foreach(Match x in result)
  matches.Add(x.Groups[1].Value.ToString());

在道德上等价于

IEnumerator enumtor = result.GetEnumerator();
while (enumtor.MoveNext())
{
    Match x = (Match)(enumtor.Current);
    ...

你可以说

foreach(Giraffe x in result)

它会编译得很好,并在运行时死亡。

当你说

foreach(var x in result)

编译器看到除了对象之外,没有可以推断的类型信息,所以这就是它为你提供的 x 类型。然后你的错误从那里开始。

我不知道为什么集合没有更新以使其更适合静态类型;你必须问BCL团队。