Исключение нулевой ссылки при просмотре значения в отладчике

Я переопределяю функцию equals в классе my и получаю исключение с нулевой точкой, несмотря на то, что когда я вхожу в тот же код в разделе "watch" отладчика, исключений нет.

Вот мой код (что-то по сравнению с == является строковым или примитивным типом):

return this.workOrder == i.workOrder
 && this.upi == i.upi
 && this.testName == i.testName
 && BasicFunctions.ArraysEqual(this.testTrays, i.testTrays)
 && this.supplyVoltage == i.supplyVoltage
 && this.supplyAmperage == i.supplyAmperage
 && this.commandResults == null ? i.commandResults == null : this.commandResults.Equals(i.commandResults)
 && this.id == i.id;

Вид из окна просмотра:

Сравнение commandResults - единственное, что может привести к нулевому исключению, и, как вы можете видеть из кода, этот сценарий должен обрабатываться тернарным оператором. Не только это, но и в тех случаях, когда он терпит неудачу, он никогда не должен был доходить до этого раздела, так как строка должна была перестать выполняться в первом ложном разделе. Как это может происходить?

Edit: В соответствии с запрошенными здесь сведениями об исключении (обратите внимание, что это вызвано функцией ArrayEquals, а исключение не находится внутри того, которое используется в указанном коде)

System.NullReferenceException was unhandled
 Message="Object reference not set to an instance of an object."
 Source="ATE"
 StackTrace:
 at ATE.Network.TestLocationListener.TestClientInformation.Equals(Object obj) in C:\Users\jdudley\git\ATE\ATE\ATE\Network\TestLocationListener.cs:line 85
 at ATE.BasicFunctions.ArraysEqual[T](T[] a1, T[] a2) in C:\Users\jdudley\git\ATE\ATE\ATE\BasicFunctions.cs:line 150
 at ATE_Remote_Controller.Form1.remoteClient1_StatusUpdated(Object sender) in C:\Users\jdudley\git\ATE\ATE\ATE Remote Controller\Form1.cs:line 25
 at ATE.Network.RemoteClient.statusRead(JSONReadCallbackResult res) in C:\Users\jdudley\git\ATE\ATE\ATE\Network\RemoteClient.cs:line 153
 at ATE.Network.JSONReader.Receive(IAsyncResult ar) in C:\Users\jdudley\git\ATE\ATE\ATE\Network\JSONReader.cs:line 236
 at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
 at System.Net.ContextAwareResult.CompleteCallback(Object state)
 at System.Threading.ExecutionContext.runTryCode(Object userData)
 at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData)
 at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state)
 at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
 at System.Net.ContextAwareResult.Complete(IntPtr userToken)
 at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
 at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(****** errorCode, ****** numBytes, NativeOverlapped* nativeOverlapped)
 at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(****** errorCode, ****** numBytes, NativeOverlapped* pOVERLAP)
 InnerException:
1 ответ

Я думаю, что то, что у вас есть, эквивалентно этому

return this.workOrder == (i.workOrder
 && this.upi == i.upi
 && this.testName == i.testName
 && BasicFunctions.ArraysEqual(this.testTrays, i.testTrays)
 && this.supplyVoltage == i.supplyVoltage
 && this.supplyAmperage == i.supplyAmperage
 && this.commandResults == null) ? 
 i.commandResults == null : 
 (this.commandResults.Equals(i.commandResults)
 && this.id == i.id);

Когда вы хотите это.

return this.workOrder == i.workOrder
 && this.upi == i.upi
 && this.testName == i.testName
 && BasicFunctions.ArraysEqual(this.testTrays, i.testTrays)
 && this.supplyVoltage == i.supplyVoltage
 && this.supplyAmperage == i.supplyAmperage
 && (this.commandResults == null ? 
 i.commandResults == null : 
 this.commandResults.Equals(i.commandResults))
 && this.id == i.id;

В принципе, если какой-либо из предыдущих операторов является ложным, например, this.supplyAmperage == i.supplyAmperage приведет к тому, что тернарный оператор выполнит this.commandResults.Equals(i.commandResults), даже если this.commandResults - null.

licensed under cc by-sa 3.0 with attribution.