差异var和类型。为什么var不起作用?

时间:2009-11-19 08:59:45

标签: c# .net

我不明白为什么var m不会返回Match。我没有检查,但它似乎正在返回一个对象。

        foreach (var m in Regex.Matches("dummy text", "(mm)"))
            var sz = m.Groups[1]; // error CS1061: 'object' does not contain a definition for 'Groups' and no extension method 'Groups' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)

        foreach (Match m in Regex.Matches("dummy text", "(mm)"))
            var sz = m.Groups[1]; //ok

3 个答案:

答案 0 :(得分:11)

Regex.Matches返回MatchCollection,而不是IEnumerable

因此默认项类型为object。在 foreach 中使用项目类型IEnumerable<Match>时,您会获得预期的项目类型。

答案 1 :(得分:9)

MatchCollection实现IEnumerable而不是IEnumerable<Match>,因此编译器只能将变量的类型推断为object而不是Match

答案 2 :(得分:7)

var 编译时中的变量类型推断从其初始化为的表达式的类型。 Matches返回MatchCollection,它会实现旧学校IEnumerable,而不是通用IEnumerable<Match>。从Current返回的枚举数返回的IEnumerable.GetEnumerator()属性的类型为object。因此,var会将m的类型推断为object而不是Match

当您在foreach语句中显式指定类型并且枚举数的返回类型不同时,编译器将以静默方式插入强制转换指令以使其工作。在这种情况下,不能执行其他编译时检查,如果失败,它将在运行时抛出InvalidCastException