2011-08-02 106 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