Используя следующий пример кода: (VS 2013, обновление 3)
dynamic demo = new ExpandoObject();
demo.Test = 10;
var j = demo.Test; // throws exception
При отладке этого кода и "Разрыв, когда исключение:" Брошено "отмечено в VS, а затем пытается получить доступ к существующему свойству" Test ", выдает a RuntimeBinderException
:
System.Dynamic.ExpandoObject 'не содержит определения для' Test '
Примечание. Переходя к следующей строке, переменная j установлена правильно на 10.
Q1: Почему генерируется исключение, когда свойство Test определенно существует и содержит значение 10, которое подтверждается фактической переменной j, успешно устанавливающей это значение? Точно такое же исключение возникает, когда я пытаюсь использовать действительно не существующее имя свойства, такое как Test2, с той разницей, что тогда код действительно выпрыгивает из блока с исключением без обработки...
Выбрасывая полностью ложное и вводящее в заблуждение исключение, затем обрабатывайте внутренне, это просто не имеет смысла, кроме того, он отображает VS 'Break, когда исключение: опция "Брошенная" практически непригодна для кода, что использует динамические объекты.
Q2: Да. Я знаю, что эту проблему можно скрыть, сняв флажок "Перерыв, когда исключение: опция" Брошенный ". Однако это не вариант, предполагающий, что разработчик использует динамические объекты и пытается найти исключения в своем коде, которые абсолютно не связаны с динамическими объектами, и эта проблема делает "Break, когда исключение: опция" брошена "непригодна, потому что то отладчик остановит тысячи правильных операторов доступа к свойствам. Есть ли способ обхода?
Пропустил что-то?
Спасибо заранее.
* Редактировать * Это редактирование после правильного ответа.
Дамир спросил в своем ответе: "Почему у меня есть опция" Включить только мой код "в ваших опциях VS?" Ну вот ответ... Я несколько раз пробовал это, и испытал, что, несмотря на то, что я явно проверяю параметр Just My Code, он каким-то образом не сохраняется между сеансами VS close/start. Наконец, я узнал, почему...