我在下面的代码中发现了一些奇怪的东西:
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节.