如何在VS 2013的即时窗口中执行LINQ和/或foreach?

25

在调试过程中,立即窗口是非常有用的工具,可以探究当前状态。我发现通过使用问号,可以像这篇文章中所示那样做更多的事情。

然而,我仍然不知道如何在其中执行LINQ查询(包括lambda表达式)。我也无法执行foreach语句。

当执行以下语句时:

?(things.Select(thing=>thing.Id);)
?(foreach(var thing in things);)

我遇到了以下错误:

表达式不能包含 lambda 表达式
无效的表达式项 'foreach'

(如何)在即时窗口中执行这些代码?
还有一个工具在VS Gallery中,但据说只适用于VS05和VS08,这些版本已经被大多数程序员抛弃了。我正在寻找适用于VS13和/或VS15的工具。

我非常确定你也不能在即时窗口或快速监视中完成它。我百分之百的猜测是,这对运行时编译器来说太复杂了,无法解释。 - DotNetRussell
VS2015不允许在观察窗口中调试lambda表达式吗?http://www.dirkstrauss.com/debugging-lambda-expressions-in-visual-studio-2015/#.ViizHH6rSHv 这里也说可以使用观察/立即窗口。 - Ric
@StasIvanov,您能指出重复我的问题的部分吗?除了使用了一些相同的单词外,我没有看到相似之处... - Konrad Viltersten
@KonradViltersten,我认为你的问题是关于在调试/立即/快速监视窗口中执行lambda表达式。这个问题已经在提到的问题中得到了回答。此外,有一个答案表明你实际上可以在VS2015中执行它,但在早期版本中不行。但也许我误解了你的问题。 - Stas Ivanov
3个回答

12

根据Visual Studio 2015中可用的新功能,在Watch / Immediate窗口中支持调试Lambda表达式:

  

Debugger窗口中的Lambda表达式

  

现在,您可以在C#和Visual Basic的Watch,Immediate和其他调试器窗口中使用Lambda表达式。

来源:

Visual Studio 2015 RTM


目前还没有找到什么有用的东西 - 不过还在继续寻找! - Ric
1
请注意,它不适用于托管兼容模式。 - Maxence

8

在VS2015中,您可以在“监视窗口”和“立即窗口”中使用lambda表达式。

只需添加监视或在“立即窗口”中键入(在调试时,things 处于作用域内):

things.Select(thing => thing.Id);

您将会得到一个结果列表。

这是一篇关于此事的博客。


VS 2013有什么进展吗?大多数人现在都在使用它,而据我所知,VS 2015还没有正式发布。有时候,我们无法选择版本,因为客户说了算。 - Konrad Viltersten
很遗憾,我不知道任何相关信息。Visual Studio 2015于2015年7月20日发布。 - Jamie Rees
2
请注意,Visual Studio 2015社区版与专业版拥有完全相同的功能(例如您可以安装插件),并且完全免费。 - Roy T.
@RoyT。我被警告说VS15仍然存在某些问题。根据我的经验,今天的RTM版本并不是一个稳定的版本,而SP1则是。 :) 话虽如此,如果社区版已经具备了相同的功能,那么购买付费版的意义何在? - Konrad Viltersten
@RoyT。回复中提到的评论指出,在VS15中该命令不可用(保持选项卡打开/将当前窥视窗口提升为文档)。这不是一个绊脚石,但它是我喜欢拥有的许多小功能之一。 (当然,我也喜欢在即时窗口中使用LINQ,但我很贪心,想要所有东西。)至于SP1作为第一个可用版本,那是个玩笑。 但是,请注意您的评论中的时态- VS13确实存在一些小问题。(是的,在那个时候,我正在使用VS10,呵呵。)我会向我的PL提出我们想要升级到VS15。 - Konrad Viltersten
显示剩余5条评论

-1

很遗憾,似乎无法在立即窗口或监视窗口中使用Lambda表达式。这个技术上的原因可能是Linq查询通常会被转换为普通表达式,而这需要一个完整的编译步骤,而不是这两个窗口所使用的技巧。

如果你不知道thing=>thing.Id部分是一个Lambda表达式。


嗯...是的,我知道Lambda表达式是什么。只是我设法执行了不包括lambies的LINQ查询(好吧,不确定*.First()* - 注意空括号是否真的算作LINQ,但仍然如此)。另外,你的回复没有考虑到foreach问题。(注:我没有投反对票。) - Konrad Viltersten
3
First() 不包含 lambda 表达式,也不是 Linq 查询。First() 被定义为所有实现 IEnumerable<T> 接口的类型的扩展方法。 - Roy T.
1
我不知道为什么foreach语句不起作用。这确实很奇怪! - Roy T.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接