我正在编写这段C#代码:
static void Main()
{
List<string> matches = new List<string>();
var result = Regex.Matches(myString, @"\((.*?)\)");
foreach(var x in result)
matches.Add(x.Groups[1].Value.ToString());
}
我很惊讶地看到它失败并显示以下错误消息:
“对象”类型不包含“组”的定义,也不包含“组”的定义 可以找到“对象”类型的扩展方法“组”。
然而,这有效:
foreach(Match x in result)
matches.Add(x.Groups[1].Value.ToString());
Matches()
方法返回MatchCollection
,x
是Match
是不是很明显?
答案 0 :(得分:11)
不应该清楚x是匹配吗?
可悲的是没有。
MatchCollection
实现了非通用旧版接口IEnumerable
。它没有实现IEnumerable<Match>
。所以不,那不清楚。
因为foreach
循环是在泛型之前的时代设计的,所以它会自动将强制转换插入到循环变量类型中。那是
foreach(Match x in result)
matches.Add(x.Groups[1].Value.ToString());
是
的道德等同物IEnumerator enumtor = result.GetEnumerator();
while (enumtor.MoveNext())
{
Match x = (Match)(enumtor.Current);
...
你可以说
foreach(Giraffe x in result)
它会编译得很好,并在运行时死掉。
当你说
时foreach(var x in result)
编译器发现没有类型信息可以推断超出对象,因此它为x的类型提供了什么。然后你的错误从那里开始。
我不知道为什么该集合尚未更新以使其更适合静态类型化;你不得不问BCL团队。