Ответ 1
JaredPar Microsoft написала пару сообщений в блоге, отвечая на ваш вопрос: часть 1 и часть 2. Вы найдете ответы там.
Есть ли какая-то особая причина? Разве это вообще невозможно или это еще не реализовано? Может быть, есть сторонние дополнения, которые позволяют оценить лямбда?
UPDATE:
Я нашел этот проект на codeplex Extended Immediate Window. Кажется, что он был оставлен на некоторое время, но это может быть доказательством концепции. Кто-нибудь знает какие-либо другие дополнительные расширения расширения окна? Те, которые могут запускаться для операторов /foreach в С#, например?
JaredPar Microsoft написала пару сообщений в блоге, отвечая на ваш вопрос: часть 1 и часть 2. Вы найдете ответы там.
При записи лямбда акт захвата переменных существенно изменяет конструкцию базового кода (перемещение переменных в поля классов, сгенерированных компилятором, что очень легко может быть связано с замкнутыми контекстами).
Даже не учитывая общую сложность этого, у него будет два варианта:
Учитывая выбор между "нежелательным" и "невозможным", я предполагаю, что они просто решили не реализовывать функцию, которая была бы изначально хрупкой и очень сложной для записи.
Ну, я думаю, потому что непосредственное окно может только оценивать выражения, или, скорее, оно может делать только вызовы и назначения. Чтобы оценить выражение Лямбды, нужно было бы создать замыкание для этой лямбды, проверять и затем выполнить.
Я думаю, все сводится к тому, что окно Immediate является просто оценщиком, а не интерпретатором.
http://msdn.microsoft.com/en-us/library/f177hahy(VS.80).aspx
"Окно Immediate используется во время разработки для отладки и оценки выражений, выполнения операторов, значений переменных печати и т.д. Оно позволяет вводить выражения, которые будут оцениваться или выполняться языком разработки во время отладки".
Таким образом, ваш вопрос сводится к тому, почему вы не можете определить функции в непосредственном окне (поскольку лямбды - это просто анонимные функции), и я думаю, что это просто не предназначено для этого.
Если вам все еще нужно использовать 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
Я предполагаю, что, поскольку это ленивая оценка, непосредственное окно не может заранее знать, какие значения должны иметь захваченные переменные (закрытие).