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

时间:2016-02-19 00:53:56

标签: c# var type-inference

我正在编写这段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()方法返回MatchCollectionxMatch是不是很明显?

1 个答案:

答案 0 :(得分:11)

  

不应该清楚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团队。