Невозможно войти в предикат в VS2008 - PullRequest
0 голосов
/ 06 октября 2011
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()));
    }
}

Что мне здесь не хватает?(кроме точек останова)

пожалуйста, обратите внимание, что он отлично отлаживается, в остальном все отлично, кроме предиката, в который я не могу вмешаться.абсолютный осел -> Stepout Shift + F11 (когда предикат указан как группа методов / делегат)

шаг в обычном режиме работает, когда предикат задан как лямбда-выражениезатем можно указать разрыв pt для предиката в лямбда-выражении

Ответы [ 2 ]

1 голос
/ 06 октября 2011

Когда вы ожидали войти в предикат? Не забывайте, что когда вы вызываете Where, не не выполняет никакой фильтрации в данный момент - он просто создает объект , представляющий отфильтрованную последовательность. Если вы ожидаете, что сможете набрать F11 на вызове Where, вы, конечно, не получите свой предикат.

Я только что попробовал это в Visual C # Express 2010, ставя точку останова в первом операторе каждого лямбда-выражения, и он без проблем достигал точек останова, поскольку выполнял предикаты в течение последних двух строк программы. Я ожидаю, что то же самое будет верно для VS2008.

1 голос
/ 06 октября 2011

Вам нужно поставить точку останова в предикат для его отладки.
Вы не можете "войти" ( F11 на моей машине) в предикат напрямую, потому что код, который вызывает предикатэто не ваш код, а код, который создается внутри Enumerable.Where, который будет выполнен, как только вы выполните итерацию результата.В вашем случае это строки с вызовом String.Join.
Короче говоря: это код платформы .NET, который выполняет эти предикаты.

...