可以从立即窗口调用扩展方法

时间:2012-01-13 12:03:13

标签: c# linq visual-studio code-contracts

我问这个问题,因为每当我尝试从Visual Studio 2010中的立即窗口调用扩展方法时,我都会收到以下错误:

  

System.Collections.Generic.IEnumerable'不包含' ToList'的定义没有扩展方法' ToList'接受类型为'System.Collections.Generic.IEnumerable'的第一个参数。可以找到(你错过了使用指令或程序集引用吗?)

如果立即窗口不支持扩展方法,那么为什么当我键入我的变量(类型为IEnumerable<QueryFilter>)后跟一个点时,IntelliSense会列出所有扩展方法?

我在命令窗口输入的内容没有任何问题,因为如果我将其复制并粘贴到我的代码文件中并运行,它就能正常工作。

使用Visual Studio 2012为同一解决方案做同样的事情可以正常工作。如果我切换回VS2010并且问题仍然存在。

5 个答案:

答案 0 :(得分:6)

扩展方法是语法糖。实际上,它们使用static关键字实施this。 您可以使用提供扩展方法的静态方法调用任何扩展方法。然后你应该将正在扩展的对象作为第一个参数传递。

答案 1 :(得分:5)

这是因为System.Linq命名空间未在您调试时的当前上下文中导入。

添加

using System.Linq;

代码。

Visual Studio 2010示例

enter image description here

首次导入System.LINQ,然后导入using System.LINQ

修改的: 如果导入名称空间并且IntelliSense正在显示方法,那么它可能是立即窗口的错误。 请参阅this bug entry on connect

答案 2 :(得分:4)

扩展方法只是静态方法。

你应该可以使用例如System.Linq.Enumerable.ToList()

答案 3 :(得分:1)

扩展方法转换为“Enumerable.ToList”编译器通常会转换

myList.Tolist();

要:

Enumerable.ToList(myList);

在编译期间。我相信如果您愿意,可以使用快速监视窗口中的扩展方法。

答案 4 :(得分:1)

此行为是由Code Contracts引起的,并不仅限于立即窗口,也包括条件断点窗口。

2016年3月1日更新 发现这个MSDN Question询问为什么类型分辨率在我的监视窗口中不起作用。描述的行为与使用立即窗口时的体验完全相同。原因还归因于CodeContracts,并且已在Microsoft Connect上提交了错误报告。是否未指出错误是否已解决。