无法在VS2008中进入谓词

时间:2011-10-06 06:35:31

标签: c# debugging visual-studio-2008-sp1

class Program
{
    static void Main(string[] args)
    {
        var numbers = new[] {1, -1, -2, 3.5, 1.1, -0.1, 2, 5.7, 8, 9, -10, -2};

        Func<double, bool> positiveIntegerSelector = x =>
        {
            if(x < 0)
                return false;

            var temp = (int) x;
            return temp == x;
        };
        Func<double, bool> negativeIntegerSelector = x =>
        {
            if(x >= 0)
                return false;

            var temp = (int) x;
            return temp == x;
        };

        var positiveIntegers = numbers.Where(positiveIntegerSelector); //unable to step in
        var negativeIntegers = numbers.Where(negativeIntegerSelector);

        Console.WriteLine(String.Join(",", positiveIntegers.Select(x => x.ToString()).ToArray()));
        Console.WriteLine(String.Join("," , negativeIntegers.Select(x => x.ToString()).ToArray()));
    }
}

这里缺少什么? (断点除外)

请注意它调试很好,否则除了我无法介入的谓词。


修改

道歉是一个绝对的傻瓜 - &gt; stepout shift + F11(当谓词被指定为方法组/委托时)

当谓词被指定为lambda表达式时,

步骤正常工作 x =&gt; positiveIntegerSelector(x)然后可以在lambda表达式中的谓词上指定break pt

2 个答案:

答案 0 :(得分:1)

您需要在谓词中放置一个断点来调试它 你不能直接“插入”(我的机器上的 F11 )谓词,因为调用谓词的代码不是你的代码,而是在Enumerable.Where内创建的代码,将在您迭代结果后立即执行。在您的情况下,这些是String.Join调用的行 简而言之:执行这些谓词的是.NET框架代码。

答案 1 :(得分:1)

你什么时候想进入谓词?不要忘记,当您致电Where时,当时没有执行任何过滤 - 它只会创建一个对象来表示过滤后的序列。如果您希望能够在Where电话上点击F11,那么您肯定不会到达您的谓词。

我刚刚在Visual C#Express 2010中尝试了这一点,在每个lambda表达式的第一个语句上设置了一个断点,它在程序的最后两行中运行谓词时没有遇到任何问题。我希望VS2008也能如此。