可以从立即窗口调用扩展方法
我问这个问题,因为每当我尝试从Visual Studio 2010中的立即窗口调用扩展方法时,我都会收到以下错误:
System.Collections.Generic.IEnumerable’不包含’ToList’的定义,也没有扩展方法’ToList’接受类型’System.Collections.Generic.IEnumerable’的第一个参数(你是否缺少using指令或assembly参考?)
如果立即窗口不支持扩展方法,那么为什么当我键入我的变量(类型为IEnumerable
)后跟一个点时,IntelliSense会列出所有扩展方法?
我在命令窗口中输入的内容没有任何问题,因为如果我将其复制并粘贴到我的代码文件中并运行,则可以正常工作。
使用Visual Studio 2012为同一解决方案做同样的事情工作正常。 如果我切换回VS2010并且问题仍然存在。
扩展方法是语法糖。 实际上它们是用this
关键字实现的static
。 您可以使用提供扩展方法的静态方法调用任何扩展方法。 然后,您应该将正在扩展的对象作为第一个参数传递。
这是因为System.Linq
命名空间不是在调试时的当前上下文中导入的。
加
using System.Linq;
在你的代码中。
Visual Studio 2010的示例 :
第一次导入System.LINQ
,然后不using System.LINQ
。
编辑 :如果导入名称空间并且IntelliSense正在显示方法,那么它可能是立即窗口的错误。 在连接上查看此错误条目 。
扩展方法只是静态方法。
你应该可以使用例如System.Linq.Enumerable.ToList()
扩展方法转换为“Enumerable.ToList”编译器通常会转换
myList.Tolist();
至:
Enumerable.ToList(myList);
在编译期间。 我相信如果您愿意,可以使用快速监视窗口中的扩展方法。
此行为是由代码约定引起的,并不仅限于立即窗口,也适用于条件断点窗口。
2016年3月1日更新:发现此MSDN问题,询问为什么类型分辨率在我的监视窗口中不起作用。 描述的行为与使用立即窗口时的体验完全相同。 原因还归因于CodeContracts,并且已在Microsoft Connect上提交了错误报告。 是否指出错误是否已解决。