C# · 12月 26, 2021

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

我注意到以下代码似乎奇怪的东西: 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节.