2011-08-02 107 views
0

当我在从lambda表达式调用的方法中放置断点时,断点永远不会被命中。当我在lambda之外移动方法调用时,会触发断点。在lambda中调用方法时未触发断点

例如:

Function IncrementAll(ByVal items As IEnumerable(Of Integer)) As IEnumerable(Of Integer) 
    Return items.Select(Function(i) Increment(i)) 
End Function 

Function Increment(ByVal i As Integer) As Integer 
    Return i + 1 'Breakpoint here 
End Function 

如果我打电话IncrementAll,在增量断点没有被击中。有没有办法让VS 2008在这些断点上停下来?我讨厌将所有LINQ重写为仅用于调试的循环。

+0

有趣的是,我知道我已经在.NET 4中完成了这项工作。您已经验证过“项目”中有元素,并且您正在调试配置中运行(即,断点将在项目的其他地方)? –

+0

是的,如果我在项目上放置一个断点。选择上面它会击中,如果我转换项目。选择一个循环,然后Increment中的断点将命中。 – Misko

回答

2

所以,我想通了。 Select返回一个IEnumerable,并且每个项目上Increment的实际执行都会延迟,直到您尝试访问IEnumerable中的项目。以获得所需的效果最快的方法是这样的:

Function IncrementAll(ByVal items As IEnumerable(Of Integer)) As IEnumerable(Of Integer) 
    Return items.Select(Function(i) Increment(i)).ToList() 
End Function 

的ToList()立即列举,因此,每一个元素上执行的增量,和您的断点将触发。

+0

就是这样。这个断点正在发挥作用,但是在我想到它之前它只会打很长时间,而我并没有让它跑到那个地步。谢谢 :) – Misko