Почему невозможно оценить лямбды в ближайшем окне? - PullRequest
20 голосов
/ 14 июня 2010

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

UPDATE:

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

Ответы [ 5 ]

15 голосов
/ 16 июня 2010

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

5 голосов
/ 14 июня 2010

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

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

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

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

4 голосов
/ 14 июня 2010

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

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

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

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

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

1 голос
/ 16 сентября 2015

Если вам все еще нужно использовать 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

0 голосов
/ 14 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...