Afzaal Ahmad Zeeshan
В строке, которую вы показали,
(Owner as ReadBarCodeInMenu).btnContainerInquiry.Enabled = true;
Есть 2 случая, когда это исключение может быть выброшено. Первый,
(Owner as ReadBarCodeInMenu).btnContainerInquiry./* code */
После того, как вы отлили
Owner
как
ReadBarCodeInMenu
, если это значение равно нулю, то
btnContainerInquiry
, будет недоступна и, таким образом, а
NullReferenceException
Но на этом все не заканчивается, если владельцем объекта был именно он—
поскольку вы предполагаете, что вы пытались инициализировать меню на что-то, хотя объект, на который ссылаются, является владельцем, но все же—второй вызов обновления свойства вызовет исключение,
/* code */.btnContainerInquiry.Enabled = true;
Это потому, что, может быть,
btnContainerInquiry
не содержит экземпляра. Так что там тоже требуется новый! Наконец,
Enabled
недвижимость, скорее всего, является
boolean
поле, и это структура, которая не содержит нулевого значения.
Теперь давайте разберем проблему и попробуем ее решить. Проблема в неинициализированном сообщении памяти заключается в том, что оно говорит вам, что что-то не так, но не может легко помочь вам с отладкой, особенно с такими операторами, как ваш. Ваш код хотя и сильно оптимизирован, но не безопасен. Вы можете переписать его вот так,
var btnContainer = (Owner as ReadBarCodeInMenu)?.btnContainerInquiry;
if(btnContainer != null) {
btnContainer.Enabled = true;
} else {
// Why was the btnContainer null?
}
Это предотвратит возникновение исключения, и вы сможете продолжить работу с вашим кодом, а также игнорировать эти исключения. Этот метод использует функции C#для безопасной навигации по объектам и прерывания, как только объект становится нулевым, вместо того чтобы создавать исключение во время выполнения.
Пожалуйста, прочтите здесь больше об этом,
Нуль-условных операторов (Справочник по c#) | Майкрософт документы[
^]