2011-08-02 12 views
0

ラムダ式から呼び出しているメソッドにブレークポイントを置くと、ブレークポイントは決してヒットしません。ラムダの外側でメソッド呼び出しを移動すると、ブレークポイントがヒットします。例えばメソッドがラムダで呼び出されたときにブレークポイントがヒットしない

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. "items"に要素があり、デバッグ構成で実行中であることを確認しました(つまり、ブレークポイントはプロジェクトの別の場所)? –

+0

ええ、私はitems.Select上のブレークポイントを置く場合はヒットし、items.Selectループを選択すると、Incrementのブレークポイントがヒットします。 – Misko

答えて

2

私はそれを理解しました。 SelectはIEnumerableを返し、IEnumerable内の項目にアクセスしようとするまで、各項目のIncrementの実際の実行は延期されます。所望の効果を得るための最も簡単な方法は、このようになります:

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

関連する問題