Ответ 1
Эта ошибка срабатывает только тогда, когда вы пытаетесь использовать диалог Watch
во время отладки.
Попытайтесь использовать какой-либо другой метод для вывода переменных, таких как Debug.WriteLine
, Console.WriteLine
и т.д.
Вот ошибка
Невозможно оценить выражение, потому что поток остановлен в точке, где сбор мусора невозможно, возможно, потому что код оптимизирован.
Я пишу просто консольное приложение, и первая строка кода такова:
List<MyObjectModel> list = MyObjectModel.GetNonCompletedReturns();
и код для функции:
public static List<MyObjectModel> GetNonCompletedReturns()
{
MyObject service = new MyObject();
List<MyObject> entities =
(from recs in service.Retrieve() where select recs).ToList();
List<MyObjectModel> models = new List<MyObjectModel>();
foreach (MyObject entity in entities)
{
models.Add(BindModel(entity));
}
return models;
}
и если я попытаюсь выполнить код, как только вернусь к основному моменту своего приложения и наведите указатель мыши на список, я получу сообщение об ошибке, которое я показал.
Может ли кто-нибудь помочь?
Эта ошибка срабатывает только тогда, когда вы пытаетесь использовать диалог Watch
во время отладки.
Попытайтесь использовать какой-либо другой метод для вывода переменных, таких как Debug.WriteLine
, Console.WriteLine
и т.д.
Если ваш проект скомпилирован в версии (при включенной оптимизации), вы можете это увидеть. Вы пробовали конфигурацию DEBUG?
Ни один из ответов не решил мою проблему, поэтому я опубликовал решение, которое помогло мне.
"Если в параметрах есть много данных, то эта ошибка может возникнуть, простым решением является создание объекта, а не структуры, потому что это объект данных.
Поместите этот объект в свои параметры вместо всех разных переменных, обычно проблема больше не будет иметь места ".
Вот небольшой трюк на всякий случай, если вы захотите изучить некоторые объекты, и вы не сможете изменить параметры:
Я создал вызов новой временной функции внутри функции, из которой я не мог наблюдать за своим объектом. Затем внутри этой новой функции я смог наблюдать за своим объектом. После выполнения задания просто удалите функцию.
Если ваша конфигурация решения Visual Studio равна Release
, переключитесь на Debug
.
Я получил это тоже, когда я ударил NullReferenceException
из стороннего элемента управления.
В этом случае я обнаружил, что если я установил точку останова до, я удалю исключение, я смог бы сделать один шаг через остальную часть кода, не видя проблемы.
Не знаю, почему, но это сработало для меня - в этом случае, по крайней мере.
Для того, что стоит, эта ошибка также может быть вызвана бесконечным циклом в getter свойства (упрощенный вариант ниже). Когда отладчик пытается оценить свойство (например, в окне просмотра), пользовательский интерфейс будет висеть в течение нескольких секунд, а ошибка "Невозможно оценить выражение..." появится для многих других свойств в том же классе.
public int MyProperty
{
get
{
while (true) { }
return 0;
}
}
Хотя верно, что "Невозможно оценить выражение, потому что поток остановлен в точке, где сбор мусора невозможен, возможно, потому, что код оптимизирован". Ошибка появляется в режиме выпуска, большинство разработчиков просто обеспечивают, чтобы их проекты были настроены на скомпилировать как сборку отладки. НО, чтобы убедиться, что у вас нет проблем с выпуском DLL, вы также должны проверить ссылки на DLL, которые находятся в вашем решении, и убедиться, что у вас нет ссылки на DLL-версию. Если вы обнаружите, что это так, удалите ссылку на DLL, а затем добавьте ссылку на проект, а не ссылку на DLL. Ссылка на проект гарантирует, что ваше решение ссылается на отладку или выпуск версий DLL, как указано в конфигурации сборки.
Обратите внимание, что приведенные выше рекомендации относятся, конечно, только к тем библиотекам DLL, к которым у вас есть исходный код и которые построены из проекта в вашем решении.
Сначала убедитесь, что вы запускаете свой код в режиме DEBUG и с отключенной оптимизацией кода. вы можете отключить это от свойств вашего проекта.
Если вы сделали все вышеперечисленное и проблема не устранена, то это, вероятно, проблема с тем, что стек имеет Debug.Break()
поверх него. Решение для этого очень просто, просто нажмите F10
, чтобы перейти к следующей строке, и вы сможете оценить выражение.
Вы можете проверить этот вопрос SO для получения дополнительной информации об этой проблеме.