C# var 关键字混淆:Type 'object' does not contain a definition for... 错误
C# var keyword confusion: Type 'object' does not contain a definition for... error
我正在写这段 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());
}
我很惊讶地看到它失败并显示此错误消息:
Type 'object' does not contain a definition for 'Groups' and no
extension method 'Groups' of type 'object' could be found.
但是,这有效:
foreach(Match x in result)
matches.Add(x.Groups[1].Value.ToString());
Matches()
方法returns一个MatchCollection
,不应该清楚x
是一个Match
吗?
shouldn't it be clear that x is a Match?
遗憾的是没有
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 团队。
我正在写这段 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());
}
我很惊讶地看到它失败并显示此错误消息:
Type 'object' does not contain a definition for 'Groups' and no extension method 'Groups' of type 'object' could be found.
但是,这有效:
foreach(Match x in result)
matches.Add(x.Groups[1].Value.ToString());
Matches()
方法returns一个MatchCollection
,不应该清楚x
是一个Match
吗?
shouldn't it be clear that x is a Match?
遗憾的是没有
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 团队。