Путаница с типажом, допускающих значение null bool в GET-метод свойства
Уважаемые эксперты
У меня есть следующий тестовый код:
public class Person : INotifyPropertyChanged { private bool? valid; public bool Valid { get { // Test only, expecting an exception in the next statement. valid = null; // Exception of typecast only shown while debugging *1) return ((bool)valid); } // .... } // .... }*1) приведение
Здесь я ожидаю исключения, и в отладчике это исключение будет показано.
Но при запуске приложения _without_ debugger исключение не будет показано, но оно есть... только не показывается. Кстати, у меня нет никакой попытки / улова, которая скрывает исключение.
Это в отличие от ...
private void buttonNullableBoolTest_Click(object sender, EventArgs e) { bool? nullableBool = null; bool testBool= (bool)nullableBool; }... который бросает и показывает также _without_ debugger исключение " System.Исключение InvalidOperationException: объект, допускающий значение null должно иметь значение."
Возникает вопрос: почему приложение не показывает исключение?
Есть идеи, что я не понимаю/неправильно истолковываю на этот раз здесь?
Заранее спасибо.
[Редактировать]
Извините, но теперь, после еще нескольких тестов, я вижу, что мне нужно быть более точным в своем вопросе.
а.) в случае, если я получаю доступ к свойству непосредственно в своем коде, например
if (person.Valid)...
затем исключение показывается также из отладчика. Так что здесь все как и ожидалось.Б.) но в случае, если я привязываю это свойство, например, к свойству кнопки Enabled с помощью
BindingSource
чем приложение не показывает исключение. Похоже на то .NET действительно скрывает исключение в этом случае :([Edit2]
Только для информации: привязка непосредственно в коде с
buttonBindingTest.DataBindings.Add(new Binding("Enabled", person, "Valid"));
делает также работает с ожидаемым поведением (приложение действительно показывает исключение один раз).... но с побочным эффектом эта привязка исчезнет :запутался:Что я уже пробовал:
Описано в вопросе выше.
Rob Philpott
Просто мысль, но это как-то связано с нитью, на которой ты находишься? Второй пример явно происходит в потоке gui, но NotifyPropertyChange предполагает, что в игре может быть задействован второй поток.
Вот в чем может быть полезен отладчик.
0x01AA
Спасибо за ваш комментарий. Оба теста работают на очень простом тестовом приложении, никаких потоков, ничего особенного.
BillWoodruff
Могу ли я предположить, что иногда это пустая трата времени, чтобы попытаться глубоко проанализировать, как компилятор и время выполнения ведут себя, когда вы пытаетесь заставить.Сеть, чтобы сделать что-то, что не совсем имеет смысл ? Почему бы просто не сделать тип свойства nullable bool и не вернуться к работе?
Philippe Mori
Я бы предположил, что привязка просто не обновляет значение, если возникает исключение, аналогичное тому, что произойдет, если вы свяжетесь со свойством, которое не существует.
0x01AA
Это гораздо хуже, в какой-то ситуации приложение полностью зависает.
0x01AA
Спасибо за ваши отзывы. Вы написали: "... что иногда это пустая трата времени ..."
Да и нет; почему я пытался проанализировать это глубоко?
а) всегда есть шанс - по крайней мере, если я напишу код, - что есть ошибка. И в случае, если такой жук молча пойман, его трудно найти.
б) я не мог поверить, что .Сеть молча ловит исключение, не давая мне возможности узнать об этом.
Наконец - то я нашел это в MSDN.Сеть действительно поддерживает это я буду проинформирован:
Событие: BindingSource.DataError
Описание: возникает, когда связанный с валютой исключение молча обрабатывается BindingSource.
https://msdn.microsoft.com/query/dev11.запрос?идентификатор AppID=Dev11IDEF1&амп;дл=де-де&амп;К=К(Системы.Окна.Формы.Объектом bindingsource.DataError);к(моникер целевой платформы-.NETFramework версии%3Dv4.5);к(DevLang-используется CSharp)&усилитель;РД=истина[^]