我注意到以下
代码似乎奇怪的东西:
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'
变量匹配类型为Object而不是Match.我习惯使用var枚举集合,没有这样的问题.为什么MatchCollection不同?
MatchCollection是在.NET 2之前编写的,所以它只是实现IEnumerable而不是IEnumerable< T>.但是,您可以使用Cast轻松修复此问题:
foreach(var match in mc.Cast<Match>())
如果你给变量一个显式类型,像这样:
foreach(Match match in mc)
那么C#编译器会自动为每个项目插入一个转换.这在C#1中是必需的,以避免在您的代码中投射.
(在逻辑上,即使使用了一个转换,但是它总是从一个类型到同一个类型,所以实际上不需要发出.)有关更多详细信息,请参见C#4规范的8.8.4节.