枚举MatchCollection时,为什么var会导致Object类型而不是Match类型?

Red*_*ter 12 c# regex

我在下面的代码中发现了一些奇怪的东西:

MatchCollection mc = Regex.Matches(myString, myPattern);
foreach(var match in mc)
    Console.WriteLine(match.Captures[0]); // <-- this line is invalid, unless I replace 'var' above with 'Match'
Run Code Online (Sandbox Code Playgroud)

变量match是类型Object而不是Match.我习惯于使用var没有这样的问题来枚举集合.为什么MatchCollection不同?

Jon*_*eet 20

MatchCollection是在.NET 2之前编写的,所以它只是实现IEnumerable而不是IEnumerable<T>.但是,您可以使用它Cast来轻松解决此问题:

foreach(var match in mc.Cast<Match>())
Run Code Online (Sandbox Code Playgroud)

如果给变量一个显式类型,如下所示:

foreach(Match match in mc)
Run Code Online (Sandbox Code Playgroud)

...然后C#编译器会自动为每个项目插入一个强制转换.这在C#1中是必需的,以避免在您的代码中进行强制转换.

(逻辑上即使var涉及转换 - 但它始终从一种类型转换为相同类型,因此实际上不需要发出任何类型.)有关详细信息,请参阅C#4规范的第8.8.4节.

  • 让您想知道为什么在发布 .NET &gt; v2 时,他们没有像对待其他集合类型那样执行实现“IEnumerable&lt;Match&gt;”的简单步骤 (2认同)