Подтвердить что ты не робот

Почему невозможно оценить лямбда в ближайшем окне?

Есть ли какая-то особая причина? Разве это вообще невозможно или это еще не реализовано? Может быть, есть сторонние дополнения, которые позволяют оценить лямбда?

UPDATE:

Я нашел этот проект на codeplex Extended Immediate Window. Кажется, что он был оставлен на некоторое время, но это может быть доказательством концепции. Кто-нибудь знает какие-либо другие дополнительные расширения расширения окна? Те, которые могут запускаться для операторов /foreach в С#, например?

4b9b3361

Ответ 1

JaredPar Microsoft написала пару сообщений в блоге, отвечая на ваш вопрос: часть 1 и часть 2. Вы найдете ответы там.

Ответ 2

При записи лямбда акт захвата переменных существенно изменяет конструкцию базового кода (перемещение переменных в поля классов, сгенерированных компилятором, что очень легко может быть связано с замкнутыми контекстами).

Даже не учитывая общую сложность этого, у него будет два варианта:

  • фиксирует все значения переменных как константы; выполнимо и довольно просто, но может легко означать, что результат выполнения в непосредственном окне очень отличается от результата выполнения в основном корпусе (очень нежелательно)
  • переписать весь код (по причинам, указанным выше) "на лету" (по предположению, невозможно)

Учитывая выбор между "нежелательным" и "невозможным", я предполагаю, что они просто решили не реализовывать функцию, которая была бы изначально хрупкой и очень сложной для записи.

Ответ 3

Ну, я думаю, потому что непосредственное окно может только оценивать выражения, или, скорее, оно может делать только вызовы и назначения. Чтобы оценить выражение Лямбды, нужно было бы создать замыкание для этой лямбды, проверять и затем выполнить.

Я думаю, все сводится к тому, что окно Immediate является просто оценщиком, а не интерпретатором.

http://msdn.microsoft.com/en-us/library/f177hahy(VS.80).aspx

"Окно Immediate используется во время разработки для отладки и оценки выражений, выполнения операторов, значений переменных печати и т.д. Оно позволяет вводить выражения, которые будут оцениваться или выполняться языком разработки во время отладки".

Таким образом, ваш вопрос сводится к тому, почему вы не можете определить функции в непосредственном окне (поскольку лямбды - это просто анонимные функции), и я думаю, что это просто не предназначено для этого.

Ответ 4

Если вам все еще нужно использовать Visual Studio 2013, вы можете написать цикл или лямбда-выражение в непосредственном окне, используя также окно консоли диспетчера пакетов. В моем случае я добавил список в верхней части функции:

    private void RemoveRoleHierarchy()
    {
#if DEBUG
        var departments = _unitOfWork.DepartmentRepository.GetAll().ToList();
        var roleHierarchies = _unitOfWork.RoleHierarchyRepository.GetAll().ToList();
#endif

        try
        {
            //RoleHierarchy
            foreach (SchoolBo.RoleHierarchy item in _listSoRoleHierarchy.Where(r => r.BusinessKeyMatched == false))
                _unitOfWork.RoleHierarchyRepository.Remove(item.Id);

            _unitOfWork.Save();
        }
        catch (Exception e)
        {
            Debug.WriteLine(e.ToString());
            throw;
        }
    }

Где моя функция GetAll():

    private DbSet<T> _dbSet;

    public virtual IList<T> GetAll()
    {
        List<T> list;
        IQueryable<T> dbQuery = _dbSet;
        list = dbQuery
            .ToList<T>();

        return list;
    }

Здесь я продолжал получать следующую ошибку, поэтому я хотел распечатать все элементы в разных репозиториях:

InnerException  {"The DELETE statement conflicted with the REFERENCE constraint \"FK_dbo.Department_dbo.RoleHierarchy_OranizationalRoleId\". The conflict occurred in database \"CC_Portal_SchoolObjectModel\", table \"dbo.Department\", column 'OranizationalRoleId'.\r\nThe statement has been terminated."} System.Exception {System.Data.SqlClient.SqlException}

Затем я узнаю, сколько записей находится в репозитории отдела, выполнив это в ближайшем окне:

_unitOfWork.DepartmentRepository.GetAll().ToList().Count

Что вернуло 243.

Итак, если вы выполните следующее в консоли диспетчера пакетов, он распечатает все элементы:

PM> for($i = 0; $i -lt 243; $i++) { $a = $dte.Debugger.GetExpression("departments[$i].OrgagnizationalRoleId"); Write-Host $a.Value $i }

Автор этой идеи можно найти здесь: http://ogresoft.blogspot.ca/2013/06/how-to-write-loop-or-lambda-expression.html

Ответ 5

Я предполагаю, что, поскольку это ленивая оценка, непосредственное окно не может заранее знать, какие значения должны иметь захваченные переменные (закрытие).