C# var 关键字混淆:类型“对象”不包含 的定义.错误
本文关键字:包含 错误 定义 对象 关键字 var 类型 | 更新日期: 2023-09-27 18:35:14
我正在编写这段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
吗?
不应该清楚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团队。