C# var 关键字混淆:Type 'object' does not contain a definition for... 错误

C# var keyword confusion: Type 'object' does not contain a definition for... error

我正在写这段 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());
    }

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

Type 'object' does not contain a definition for 'Groups' and no extension method 'Groups' of type 'object' could be found.

但是,这有效:

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

Matches()方法returns一个MatchCollection,不应该清楚x是一个Match吗?

shouldn't it be clear that x is a Match?

遗憾的是没有

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 团队。