尝试编译时,添加lambda表达式会导致奇怪的错误

时间:2013-10-23 08:48:27

标签: c# lambda

所以目前有一段看起来像这样的代码......

string name = GetValues(sequenceOfCodes, 0, IDtoMatch, 1)[0];

我刚刚将以下行更新为

string name = sequenceOfCodes
                  .Select(x => x[0])
                      .Where(x => x == IDtoMatch)
                          .FirstOrDefault();

哪个应该有希望返回相同的东西。

sequenceOfCodes是List<List<String>>IDtoMatch也是string

所以希望这一切看起来都很好。

然而,当我去编译时,我得到一个奇怪的错误

The type 'System.Windows.Forms.ComboBox' is defined in an assembly 
that is not referenced. 

You must add a reference to assembly 'System.Windows.Forms, Version=4.0.0.0, 
Culture=neutral, PublicKeyToken=b77a5c561934e089'

当我把新添加的代码带走时,编译好并运行......那么为什么只是因为我添加了lambda expression它是否认为我需要引用System.Windows.Forms.ComboBox

只是说明这是一个控制台应用程序。 一个winforms应用程序。

----------- ---------- UPDATE

好的,所以我发现其中一个引用确实引用了System.Windows.Forms,我真的很失望,因为这是核心代码,不应该有这样的依赖:(

但是我仍然想知道为什么错误之前没有出现,直到我添加了我的代码行。

要确认,如果我删除了我的代码,我可以关闭VS并重新启动并重建,一切都很好。 如果我添加我的代码行并关闭并重新启动,等等。重建时会再次出现错误。

对我来说非常奇怪。

谢谢大家的帮助

1 个答案:

答案 0 :(得分:1)

您提到其他项目之一确实引用了Windows窗体。我的 guess 是这个项目还声明了一些范围内的扩展方法(给定你的using指令),以及编译器需要探索的重载解析 - 可能是{{1 }},WhereSelect方法;意思是:在将它与其他候选者进行比较之前,它无法确定这些最佳重载是FirstOrDefault重载,并且如果不能理解它就无法做到这一点竞争方法签名中使用的类型。

或换句话说:是否有System.Linq.EnumerableSelectWhere自定义扩展程序提及FirstOrDefault