Ответ 1
Проверьте эту ссылку. Это известная ошибка в некоторых версиях Visual Studio и версии .NET Framework. Это совершенно безвредно, и вам придется с этим жить.
Учитывая этот драгоценный камень кода:
class Program
{
private static bool IsAdmin = true;
static void Main(string[] args)
{
if (!IsAdmin)
{
throw new Exception();
}
try
{
var x = 2342342;
var y = 123132;
}
catch (Exception)
{
throw;
}
}
}
Учитывая, что this.IsAdmin
дает true - я бы ожидал, что отладчик не будет вводить этот оператор if. На самом деле это происходит - и он срабатывает над броском, но на самом деле не бросает!
Теперь это происходит только тогда, когда у вас есть исключение внутри оператора if, за которым следует блок try/catch, на Visual Studio 2013, ориентированный на .NET Framework 4, 64 бит, "Предпочитаете 32 бит", не установлен.
Я подтвердил эту странность коллегами на разных машинах. Шаг, хотя следующий код и отладчик, похоже, войдут в ветку if, но исключение не будет выбрано:
Я работаю в режиме отладки, я попытался несколько раз собрать и очистить проект.
Может кто-нибудь объяснить, почему это происходит?
Проверьте эту ссылку. Это известная ошибка в некоторых версиях Visual Studio и версии .NET Framework. Это совершенно безвредно, и вам придется с этим жить.
Это известная проблема, вызванная джиттером x64, изредка генерирует плохую информацию о номере отладки. Он может ошибаться, когда оператор вызывает создание дополнительных инструкций NOPs, предназначенных для выравнивания кода. Первый NOP становится номером строки, а не инструкцией после NOP. Это байты в нескольких местах, как оператор throw после простого if() теста и использования оператор с простыми скалярными операндами. Эти выравнивающие NOP также являются причиной того, что так опасно прерывать потоки, описанные в этом сообщении.
Простейшим решением является проект + Свойства, вкладка "Сборка", отметьте опцию "Предпочитайте 32-разрядную", если таковая имеется, установите для платформы цель x86 иначе. Обратите внимание, что ничто не пошло не так, в то время как отладчик предполагает, что оператор throw будет выполнен, ваша программа фактически не генерирует исключение.
Работа над этим, джиттер x64 был сильно переписан, проект RyuJIT. Он будет отправлен в VS2015, в настоящее время в Preview.
Просто сделайте Debug.Writeline(IsAdmin) перед оператором if.